Changeset: 4903c1fd6962 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4903c1fd6962
Modified Files:
        sql/backends/monet5/vaults/odbc/odbc_loader.c
Branch: Mar2025
Log Message:

Fix AddressSanitizer: heap-buffer-overflow


diffs (54 lines):

diff --git a/sql/backends/monet5/vaults/odbc/odbc_loader.c 
b/sql/backends/monet5/vaults/odbc/odbc_loader.c
--- a/sql/backends/monet5/vaults/odbc/odbc_loader.c
+++ b/sql/backends/monet5/vaults/odbc/odbc_loader.c
@@ -294,11 +294,11 @@ str_to_hge(const char *s) {
 /* an ODBC function call returned an error, get the error msg from the ODBC 
driver */
 static char *
 getErrMsg(SQLSMALLINT handleType, SQLHANDLE handle) {
-       SQLRETURN ret = SQL_ERROR;
+       SQLRETURN ret;
        SQLCHAR state[SQL_SQLSTATE_SIZE +1];
        SQLINTEGER errnr;
-       SQLCHAR msg[4096];
-       SQLSMALLINT msglen;
+       SQLCHAR msg[SQL_MAX_MESSAGE_LENGTH] = { 0 };
+       SQLSMALLINT msglen = SQL_MAX_MESSAGE_LENGTH -1;
 
        if (handle == SQL_NULL_HSTMT)
                return NULL;
@@ -307,11 +307,15 @@ getErrMsg(SQLSMALLINT handleType, SQLHAN
        ret = SQLGetDiagRec(handleType, handle, 1, state, &errnr, msg, 
(sizeof(msg) -1), &msglen);
        if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {
                const char format[] = "SQLSTATE %s, Error code %d, Message %s";
-               char * retmsg = (char *) malloc(sizeof(format) + MIN(msglen, 
4096));
+               if (msglen <= 0) {
+                       /* e.g SQL_NTS */
+                       msglen = strlen((char *)msg);
+               }
+               char * retmsg = (char *) GDKmalloc(sizeof(format) + 
SQL_SQLSTATE_SIZE + 10 + msglen);
                if (retmsg != NULL) {
                        if (state[SQL_SQLSTATE_SIZE] != '\0')
                                state[SQL_SQLSTATE_SIZE] = '\0';
-                       sprintf(retmsg, format, (char*)state, errnr, 
(char*)msg);
+                       sprintf(retmsg, format, (char *)state, errnr, (char 
*)msg);
                        return retmsg;
                }
        }
@@ -887,7 +891,7 @@ odbc_query(int caller, mvc *sql, sql_sub
                                                printf("Failed to get C_type %d 
data for col %u of row %lu. ODBCmsg: %s\n",
                                                        targetType, col+1, row, 
(ODBCmsg) ? ODBCmsg : "");
                                                if (ODBCmsg)
-                                                       free(ODBCmsg);
+                                                       GDKfree(ODBCmsg);
                                        }
                                        /* as all bats need to be the correct 
length, append NULL value */
                                        if (BUNappend(b, ATOMnilptr(b->ttype), 
false) != GDK_SUCCEED)
@@ -1216,7 +1220,7 @@ odbc_query(int caller, mvc *sql, sql_sub
                        retmsg = sa_message(sql->sa, "odbc_loader" " %s", 
(ODBCmsg) ? ODBCmsg : "");
                }
                if (ODBCmsg)
-                       free(ODBCmsg);
+                       GDKfree(ODBCmsg);
                odbc_cleanup(env, dbc, stmt);
                return retmsg;
        }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to