From 6743b3a8bd2b4761b05e800e5d104b686aa85ea3 Mon Sep 17 00:00:00 2001 From: Igor Sapego Date: Wed, 25 Oct 2017 11:46:15 +0300 Subject: [PATCH 1/2] IGNITE-6511: Fixed behaviour --- modules/platforms/cpp/odbc/src/odbc.cpp | 29 ++++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/modules/platforms/cpp/odbc/src/odbc.cpp b/modules/platforms/cpp/odbc/src/odbc.cpp index baa276a55afa4..8121a3bcbca1c 100644 --- a/modules/platforms/cpp/odbc/src/odbc.cpp +++ b/modules/platforms/cpp/odbc/src/odbc.cpp @@ -984,16 +984,22 @@ namespace ignite { Diagnosable *diag = reinterpret_cast(handle); + if (!diag) + return SQL_INVALID_HANDLE; + records = &diag->GetDiagnosticRecords(); break; } default: - break; + return SQL_INVALID_HANDLE; } - if (!records || recNum < 1 || recNum > records->GetStatusRecordsNumber()) + if (recNum < 1 || msgBufferLen < 0) + return SQL_ERROR; + + if (!records || recNum > records->GetStatusRecordsNumber()) return SQL_NO_DATA; const DiagnosticRecord& record = records->GetStatusRecord(recNum); @@ -1004,13 +1010,24 @@ namespace ignite if (nativeError) *nativeError = 0; - SqlLen outResLen; - ApplicationDataBuffer outBuffer(OdbcNativeType::AI_CHAR, msgBuffer, msgBufferLen, &outResLen); + const std::string& errMsg = record.GetMessageText(); - outBuffer.PutString(record.GetMessageText()); + if (!msgBuffer || msgBufferLen < static_cast(errMsg.size() + 1)) + { + if (!msgLen) + return SQL_ERROR; + + CopyStringToBuffer(errMsg, reinterpret_cast(msgBuffer), static_cast(msgBufferLen)); + + *msgLen = static_cast(errMsg.size()); + + return SQL_SUCCESS_WITH_INFO; + } + + CopyStringToBuffer(errMsg, reinterpret_cast(msgBuffer), static_cast(msgBufferLen)); if (msgLen) - *msgLen = static_cast(outResLen); + *msgLen = static_cast(errMsg.size()); return SQL_SUCCESS; } From c015ee40f6ef3f9947ddc9ef77cf846d3f7c2a08 Mon Sep 17 00:00:00 2001 From: Igor Sapego Date: Wed, 25 Oct 2017 12:24:08 +0300 Subject: [PATCH 2/2] IGNITE-6511: Added test --- .../cpp/odbc-test/src/api_robustness_test.cpp | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp index 82f7274cf8d17..c17e079e25f10 100644 --- a/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp +++ b/modules/platforms/cpp/odbc-test/src/api_robustness_test.cpp @@ -976,26 +976,31 @@ BOOST_AUTO_TEST_CASE(TestSQLGetDiagField) BOOST_AUTO_TEST_CASE(TestSQLGetDiagRec) { - // There are no checks because we do not really care what is the result of these - // calls as long as they do not cause segmentation fault. - Connect("DRIVER={Apache Ignite};address=127.0.0.1:11110;schema=cache"); - // Should fail. - SQLRETURN ret = SQLGetTypeInfo(stmt, SQL_INTERVAL_MONTH); - - BOOST_REQUIRE_EQUAL(ret, SQL_ERROR); - SQLCHAR state[ODBC_BUFFER_SIZE]; SQLINTEGER nativeError = 0; SQLCHAR message[ODBC_BUFFER_SIZE]; SQLSMALLINT messageLen = 0; - // Everithing is ok - ret = SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, &nativeError, message, sizeof(message), &messageLen); + // Generating error. + SQLRETURN ret = SQLGetTypeInfo(stmt, SQL_INTERVAL_MONTH); + BOOST_REQUIRE_EQUAL(ret, SQL_ERROR); + // Everithing is ok. + ret = SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, &nativeError, message, sizeof(message), &messageLen); BOOST_REQUIRE_EQUAL(ret, SQL_SUCCESS); + // Should return error. + ret = SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, &nativeError, message, -1, &messageLen); + BOOST_REQUIRE_EQUAL(ret, SQL_ERROR); + + // Should return message length. + ret = SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, &nativeError, message, 1, &messageLen); + BOOST_REQUIRE_EQUAL(ret, SQL_SUCCESS_WITH_INFO); + + // There are no checks because we do not really care what is the result of these + // calls as long as they do not cause segmentation fault. SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, 0, &nativeError, message, sizeof(message), &messageLen); SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, 0, message, sizeof(message), &messageLen); SQLGetDiagRec(SQL_HANDLE_STMT, stmt, 1, state, &nativeError, 0, sizeof(message), &messageLen);