Changeset: 093d9a60f588 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/093d9a60f588 Modified Files: clients/odbc/driver/ODBCDbc.h clients/odbc/driver/SQLConnect.c clients/odbc/driver/SQLDriverConnect.c clients/odbc/samples/odbcconnect.c Branch: odbc-tls Log Message:
More valgrind diffs (112 lines): diff --git a/clients/odbc/driver/ODBCDbc.h b/clients/odbc/driver/ODBCDbc.h --- a/clients/odbc/driver/ODBCDbc.h +++ b/clients/odbc/driver/ODBCDbc.h @@ -164,6 +164,7 @@ SQLRETURN MNDBSetConnectAttr(ODBCDbc *db */ extern char *ODBCTranslateSQL(ODBCDbc *dbc, const SQLCHAR *query, size_t length, SQLULEN noscan); +// consumes 'settings'! extern SQLRETURN MNDBConnectSettings(ODBCDbc *dbc, const char *dsn, msettings *settings); extern SQLRETURN MNDBDriverConnect(ODBCDbc *dbc, SQLHWND WindowHandle, const SQLCHAR *InConnectionString, SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr, SQLUSMALLINT DriverCompletion, int tryOnly); diff --git a/clients/odbc/driver/SQLConnect.c b/clients/odbc/driver/SQLConnect.c --- a/clients/odbc/driver/SQLConnect.c +++ b/clients/odbc/driver/SQLConnect.c @@ -482,9 +482,7 @@ MNDBConnect(ODBCDbc *dbc, SQLRETURN ret; ret = MNDBConnectSettings(dbc, dsn, settings); - if (SQL_SUCCEEDED(ret)) { - settings = NULL; // must not be free'd now - } + settings = NULL; // must not be free'd now goto end; @@ -522,6 +520,7 @@ MNDBConnectSettings(ODBCDbc *dbc, const Mapi mid = mapi_settings(settings); if (mid) { + settings = NULL; // will be free'd as part of 'mid' now mapi_setAutocommit(mid, dbc->sql_attr_autocommit == SQL_AUTOCOMMIT_ON); mapi_set_size_header(mid, true); mapi_reconnect(mid); @@ -530,6 +529,9 @@ MNDBConnectSettings(ODBCDbc *dbc, const const char *error_state = "08001"; const char *error_explanation = mid ? mapi_error_str(mid) : NULL; addDbcError(dbc, error_state, error_explanation, 0); + if (mid) + mapi_destroy(mid); + msettings_destroy(settings); msettings_destroy(clone); return SQL_ERROR; } diff --git a/clients/odbc/driver/SQLDriverConnect.c b/clients/odbc/driver/SQLDriverConnect.c --- a/clients/odbc/driver/SQLDriverConnect.c +++ b/clients/odbc/driver/SQLDriverConnect.c @@ -370,10 +370,10 @@ MNDBDriverConnect(ODBCDbc *dbc, setODBCdebug(scratch_no_alloc, false); rc = MNDBConnectSettings(dbc, dsn, settings); + settings = NULL; // do not free now if (!SQL_SUCCEEDED(rc)) goto end; // not to 'failure', all errors have already been logged - settings = NULL; // do not free now // Build a connect string for the current connection // and put it in the buffer. diff --git a/clients/odbc/samples/odbcconnect.c b/clients/odbc/samples/odbcconnect.c --- a/clients/odbc/samples/odbcconnect.c +++ b/clients/odbc/samples/odbcconnect.c @@ -50,6 +50,17 @@ SQLHANDLE conn = NULL; SQLCHAR outbuf[4096]; +static void +cleanup(void) +{ + if (conn) { + SQLDisconnect(conn); + SQLFreeHandle(SQL_HANDLE_DBC, conn); + } + if (env) + SQLFreeHandle(SQL_HANDLE_DBC, env); +} + int main(int argc, char **argv) { @@ -108,10 +119,8 @@ main(int argc, char **argv) break; } - SQLDisconnect(conn); - SQLFreeHandle(SQL_HANDLE_DBC, conn); - SQLFreeHandle(SQL_HANDLE_DBC, env); free(targets); + cleanup(); return ret; } @@ -137,7 +146,7 @@ ensure_ok(SQLSMALLINT type, SQLHANDLE ha break; default: fprintf(stderr, "Internal error: %s: unknown SQLRETURN %d", message, ret); - exit(1); + break; } SQLCHAR state[6]; @@ -157,6 +166,11 @@ ensure_ok(SQLSMALLINT type, SQLHANDLE ha } fprintf(stderr, " - %s: %s\n", state, explanation); } + + if (!SQL_SUCCEEDED(ret)) { + cleanup(); + exit(1); + } } _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org