]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] ODBC: Fix large column logic and improve error handling.
authorMike Jerris <mike@signalwire.com>
Tue, 17 Nov 2020 20:01:03 +0000 (00:01 +0400)
committerAndrey Volk <andywolk@gmail.com>
Wed, 17 Mar 2021 15:25:57 +0000 (18:25 +0300)
src/switch_odbc.c

index 4445eb4c1fb4b9abff4c1e67f29c9d6b4770c86d..fbad0e371a98617d178be2fa16c65ff7d9c35f8d 100644 (file)
@@ -645,12 +645,21 @@ SWITCH_DECLARE(switch_odbc_status_t) switch_odbc_handle_callback_exec_detailed(c
 
                                        if (truncated) {
                                                if (StrLen_or_IndPtr && StrLen_or_IndPtr <= 268435456) {
+                                                       int ValLen = strlen((char*)val);
                                                        ColumnSize = StrLen_or_IndPtr + 1;
                                                        vals[y] = malloc(ColumnSize);
                                                        switch_assert(vals[y]);
                                                        memset(vals[y], 0, ColumnSize);
-                                                       SQLGetData(stmt, x, SQL_C_CHAR, (SQLCHAR *) vals[y], ColumnSize, NULL);
-                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "SQLGetData large column [%lu]\n", (unsigned long)ColumnSize);
+                                                       strcpy(vals[y], (char*)val);
+                                                       rc = SQLGetData(stmt, x, SQL_C_CHAR, (SQLCHAR *)vals[y] + ValLen, ColumnSize - ValLen, NULL);
+                                                       if (rc != SQL_SUCCESS 
+#if (ODBCVER >= 0x0300)
+                                                               && rc != SQL_NO_DATA
+#endif
+                                                               ) {
+                                                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SQLGetData was truncated and failed to complete.\n");
+                                                               switch_safe_free(vals[y]);
+                                                       }
                                                } else {
                                                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "sql data truncated - %s\n",SqlState);
                                                        vals[y] = NULL;