diff --git a/0001-Fix-some-leaks.patch b/0001-Fix-some-leaks.patch new file mode 100644 index 0000000000000000000000000000000000000000..5614ecfab887b217d14f87376c5c7a21d010fd80 --- /dev/null +++ b/0001-Fix-some-leaks.patch @@ -0,0 +1,478 @@ +From 334faa0e5928289396715b39f08d29cc93bea594 Mon Sep 17 00:00:00 2001 +From: lurcher +Date: Tue, 30 Jun 2020 10:58:00 +0100 +Subject: [PATCH] Fix some leaks + +--- + DriverManager/SQLCancel.c | 14 ++------ + DriverManager/SQLCancelHandle.c | 14 ++------ + DriverManager/SQLGetConnectOption.c | 9 +---- + DriverManager/SQLGetConnectOptionW.c | 9 +---- + cur/SQLAllocStmt.c | 2 +- + cur/SQLConnect.c | 3 ++ + odbcinst/ODBCINSTConstructProperties.c | 2 ++ + odbcinst/SQLConfigDriver.c | 9 ++--- + odbcinst/SQLCreateDataSource.c | 49 +++++++++++++++++++++----- + odbcinst/SQLManageDataSources.c | 23 +++++++++--- + odbcinst/SQLReadFileDSN.c | 7 ++-- + odbcinst/_SQLDriverConnectPrompt.c | 41 ++++++++++++++------- + 12 files changed, 111 insertions(+), 71 deletions(-) + +diff --git a/DriverManager/SQLCancel.c b/DriverManager/SQLCancel.c +index 0d28b61..956a3ac 100644 +--- a/DriverManager/SQLCancel.c ++++ b/DriverManager/SQLCancel.c +@@ -236,18 +236,8 @@ SQLRETURN SQLCancel( SQLHSTMT statement_handle ) + else if ( statement -> interupted_func == + SQL_API_SQLBULKOPERATIONS ) + { +- if ( statement -> interupted_state == STATE_S5 || +- statement -> interupted_state == STATE_S6 || +- statement -> interupted_state == STATE_S7 ) +- { +- statement -> state = STATE_S6; +- statement -> eod = 0; +- } +- else +- { +- statement -> state = STATE_S6; +- statement -> eod = 0; +- } ++ statement -> state = STATE_S6; ++ statement -> eod = 0; + } + else if ( statement -> interupted_func == + SQL_API_SQLSETPOS ) +diff --git a/DriverManager/SQLCancelHandle.c b/DriverManager/SQLCancelHandle.c +index 6b3f71f..652b373 100644 +--- a/DriverManager/SQLCancelHandle.c ++++ b/DriverManager/SQLCancelHandle.c +@@ -140,18 +140,8 @@ SQLRETURN SQLCancelHandle( SQLSMALLINT HandleType, SQLHANDLE Handle ) + else if ( statement -> interupted_func == + SQL_API_SQLBULKOPERATIONS ) + { +- if ( statement -> interupted_state == STATE_S5 || +- statement -> interupted_state == STATE_S6 || +- statement -> interupted_state == STATE_S7 ) +- { +- statement -> state = STATE_S6; +- statement -> eod = 0; +- } +- else +- { +- statement -> state = STATE_S6; +- statement -> eod = 0; +- } ++ statement -> state = STATE_S6; ++ statement -> eod = 0; + } + else if ( statement -> interupted_func == + SQL_API_SQLSETPOS ) +diff --git a/DriverManager/SQLGetConnectOption.c b/DriverManager/SQLGetConnectOption.c +index c913be4..53b100c 100644 +--- a/DriverManager/SQLGetConnectOption.c ++++ b/DriverManager/SQLGetConnectOption.c +@@ -171,14 +171,7 @@ SQLRETURN SQLGetConnectOption( SQLHDBC connection_handle, + { + if ( value ) + { +- if ( log_info.log_flag ) +- { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; +- } +- else +- { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; +- } ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; + } + + return SQL_SUCCESS; +diff --git a/DriverManager/SQLGetConnectOptionW.c b/DriverManager/SQLGetConnectOptionW.c +index b5a9c83..50de4d2 100644 +--- a/DriverManager/SQLGetConnectOptionW.c ++++ b/DriverManager/SQLGetConnectOptionW.c +@@ -110,14 +110,7 @@ SQLRETURN SQLGetConnectOptionW( SQLHDBC connection_handle, + { + if ( value ) + { +- if ( log_info.log_flag ) +- { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; +- } +- else +- { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; +- } ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; + } + + return SQL_SUCCESS; +diff --git a/cur/SQLAllocStmt.c b/cur/SQLAllocStmt.c +index f651237..7b0960c 100644 +--- a/cur/SQLAllocStmt.c ++++ b/cur/SQLAllocStmt.c +@@ -83,7 +83,7 @@ SQLRETURN CLAllocStmt( SQLHDBC connection_handle, + LOG_INFO, + "Error: IM001" ); + +- cl_statement -> cl_connection -> dh.__post_internal_error( &connection -> error, ++ cl_connection -> dh.__post_internal_error( &connection -> error, + ERROR_HY001, NULL, + connection -> environment -> requested_version ); + +diff --git a/cur/SQLConnect.c b/cur/SQLConnect.c +index 592255f..89c1838 100644 +--- a/cur/SQLConnect.c ++++ b/cur/SQLConnect.c +@@ -299,6 +299,9 @@ SQLRETURN CLConnect( DMHDBC connection, struct driver_helper_funcs *dh ) + cl_connection -> dh.__post_internal_error( &connection -> error, + ERROR_HY001, NULL, + connection -> environment -> requested_version ); ++ ++ free( cl_connection ); ++ + return SQL_ERROR; + } + +diff --git a/odbcinst/ODBCINSTConstructProperties.c b/odbcinst/ODBCINSTConstructProperties.c +index ab28824..c62f608 100644 +--- a/odbcinst/ODBCINSTConstructProperties.c ++++ b/odbcinst/ODBCINSTConstructProperties.c +@@ -244,6 +244,8 @@ int ODBCINSTConstructProperties( char *pszDriver, HODBCINSTPROPERTY *hFirstPrope + /* APPEND OTHERS */ + pODBCINSTGetProperties( hLastProperty ); + ++ lt_dlclose( hDLL ); ++ + return ODBCINST_SUCCESS; + } + +diff --git a/odbcinst/SQLConfigDriver.c b/odbcinst/SQLConfigDriver.c +index 25520a1..89393a8 100644 +--- a/odbcinst/SQLConfigDriver.c ++++ b/odbcinst/SQLConfigDriver.c +@@ -24,7 +24,6 @@ static BOOL SQLConfigDriverWide( HWND hWnd, + LPWSTR pszMsgW, + int *iswide ) + { +- BOOL nReturn; + void *hDLL; + BOOL (*pConfigDriver)( HWND, WORD, LPCSTR, LPCSTR, LPCSTR, WORD, WORD * ); + BOOL (*pConfigDriverW)( HWND, WORD, LPCWSTR, LPCWSTR, LPCWSTR, WORD, WORD * ); +@@ -36,7 +35,6 @@ static BOOL SQLConfigDriverWide( HWND hWnd, + *iswide = 0; + + /* SANITY CHECKS */ +- nReturn = FALSE; + if ( pszDriver == NULL ) + { + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" ); +@@ -109,14 +107,17 @@ static BOOL SQLConfigDriverWide( HWND hWnd, + pConfigDriverW = (BOOL (*)(HWND, WORD, LPCWSTR, LPCWSTR, LPCWSTR, WORD, WORD * )) lt_dlsym( hDLL, "ConfigDriverW" ); + /* if ( lt_dlerror() == NULL ) */ + if ( pConfigDriver ) +- nReturn = pConfigDriver( hWnd, nRequest, pszDriver, pszArgs, pszMsg, nMsgMax, pnMsgOut); ++ (void) pConfigDriver( hWnd, nRequest, pszDriver, pszArgs, pszMsg, nMsgMax, pnMsgOut); + else if ( pConfigDriverW ) + { +- nReturn = pConfigDriverW( hWnd, nRequest, pszDriverW, pszArgsW, pszMsgW, nMsgMax, pnMsgOut); ++ (void) pConfigDriverW( hWnd, nRequest, pszDriverW, pszArgsW, pszMsgW, nMsgMax, pnMsgOut); + *iswide = 1; + } + else ++ { + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); ++ } ++ lt_dlclose( hDLL ); + } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "" ); +diff --git a/odbcinst/SQLCreateDataSource.c b/odbcinst/SQLCreateDataSource.c +index ff80f9e..a567bbc 100644 +--- a/odbcinst/SQLCreateDataSource.c ++++ b/odbcinst/SQLCreateDataSource.c +@@ -242,10 +242,19 @@ BOOL SQLCreateDataSource( HWND hWnd, LPCSTR pszDS ) + { + /* change the name, as it avoids it finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND, LPCSTR))lt_dlsym( hDLL, "ODBCCreateDataSource" ); +- if ( pSQLCreateDataSource ) +- return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); ++ ++ if ( pSQLCreateDataSource ) { ++ BOOL ret; ++ ++ ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + else + { +@@ -256,10 +265,18 @@ BOOL SQLCreateDataSource( HWND hWnd, LPCSTR pszDS ) + { + /* change the name, as it avoids linker finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND,LPCSTR))lt_dlsym( hDLL, "ODBCCreateDataSource" ); +- if ( pSQLCreateDataSource ) +- return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); ++ if ( pSQLCreateDataSource ) { ++ BOOL ret; ++ ++ ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + } + +@@ -308,10 +325,18 @@ BOOL INSTAPI SQLCreateDataSourceW( HWND hwndParent, LPCWSTR lpszDSN ) + { + /* change the name, as it avoids it finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND, LPCWSTR))lt_dlsym( hDLL, "ODBCCreateDataSourceW" ); +- if ( pSQLCreateDataSource ) +- return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); ++ if ( pSQLCreateDataSource ) { ++ BOOL ret; ++ ++ ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + else + { +@@ -322,10 +347,18 @@ BOOL INSTAPI SQLCreateDataSourceW( HWND hwndParent, LPCWSTR lpszDSN ) + { + /* change the name, as it avoids linker finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND,LPCWSTR))lt_dlsym( hDLL, "ODBCCreateDataSourceW" ); +- if ( pSQLCreateDataSource ) +- return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); ++ if ( pSQLCreateDataSource ) { ++ BOOL ret; ++ ++ ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + } + +diff --git a/odbcinst/SQLManageDataSources.c b/odbcinst/SQLManageDataSources.c +index d1fba81..6d4e80b 100644 +--- a/odbcinst/SQLManageDataSources.c ++++ b/odbcinst/SQLManageDataSources.c +@@ -153,10 +153,17 @@ BOOL SQLManageDataSources( HWND hWnd ) + { + /* change the name (SQLManageDataSources to ODBCManageDataSources) to prevent us from calling ourself */ + pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "ODBCManageDataSources" ); +- if ( pSQLManageDataSources ) +- return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); ++ if ( pSQLManageDataSources ) { ++ BOOL ret; ++ ret = pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + else + { +@@ -169,10 +176,18 @@ BOOL SQLManageDataSources( HWND hWnd ) + /* change the name (SQLManageDataSources to ODBCManageDataSources) to prevent us from calling ourself */ + /* its only safe to use hWnd if szUI was specified by the caller */ + pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "ODBCManageDataSources" ); +- if ( pSQLManageDataSources ) +- return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); ++ if ( pSQLManageDataSources ) { ++ BOOL ret; ++ ++ ret = pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); ++ ++ lt_dlclose( hDLL ); ++ return ret; ++ } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); ++ ++ lt_dlclose( hDLL ); + } + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +diff --git a/odbcinst/SQLReadFileDSN.c b/odbcinst/SQLReadFileDSN.c +index cc94104..978cdbe 100644 +--- a/odbcinst/SQLReadFileDSN.c ++++ b/odbcinst/SQLReadFileDSN.c +@@ -87,7 +87,6 @@ BOOL SQLReadFileDSN( LPCSTR pszFileName, + WORD *pnString ) + { + HINI hIni; +- int nBufPos = 0; + char szValue[INI_MAX_PROPERTY_VALUE+1]; + char szFileName[ODBC_FILENAME_MAX+1]; + +@@ -186,6 +185,11 @@ BOOL SQLReadFileDSN( LPCSTR pszFileName, + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, + ODBC_ERROR_REQUEST_FAILED, "" ); + ++ if ( pszFileName ) ++ { ++ iniClose( hIni ); ++ } ++ + return FALSE; + } + else +@@ -193,7 +197,6 @@ BOOL SQLReadFileDSN( LPCSTR pszFileName, + iniValue( hIni, szValue ); + strncpy( pszString, szValue, nString ); + pszString[ nString - 1 ] = '\0'; +- nBufPos = strlen( szValue ); + } + } + +diff --git a/odbcinst/_SQLDriverConnectPrompt.c b/odbcinst/_SQLDriverConnectPrompt.c +index 43b2dcd..16faa3e 100644 +--- a/odbcinst/_SQLDriverConnectPrompt.c ++++ b/odbcinst/_SQLDriverConnectPrompt.c +@@ -12,6 +12,7 @@ BOOL _SQLDriverConnectPrompt( + char szPathAndName[FILENAME_MAX]; + void * hDLL; + BOOL (*pODBCDriverConnectPrompt)(HWND, SQLCHAR *, SQLSMALLINT ); ++ BOOL ret; + + /* initialize libtool */ + if ( lt_dlinit() ) +@@ -40,17 +41,21 @@ BOOL _SQLDriverConnectPrompt( + { + if ( hODBCInstWnd ) + { +- return pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ ret = pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- return pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); ++ ret = pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); + } + } + else + { +- return FALSE; ++ ret = FALSE; + } ++ ++ lt_dlclose( hDLL ); ++ ++ return ret; + } + else + { +@@ -65,17 +70,20 @@ BOOL _SQLDriverConnectPrompt( + { + if ( hODBCInstWnd ) + { +- return pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ ret = pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- return pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); ++ ret = pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); + } + } + else + { +- return FALSE; ++ ret = FALSE; + } ++ ++ lt_dlclose( hDLL ); ++ return ret; + } + } + +@@ -93,6 +101,7 @@ BOOL _SQLDriverConnectPromptW( + char szPathAndName[FILENAME_MAX]; + void * hDLL; + BOOL (*pODBCDriverConnectPromptW)(HWND, SQLWCHAR *, SQLSMALLINT ); ++ BOOL ret; + + /* initialize libtool */ + if ( lt_dlinit() ) +@@ -121,17 +130,21 @@ BOOL _SQLDriverConnectPromptW( + { + if ( hODBCInstWnd ) + { +- return pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ ret = pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- return pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); ++ ret = pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); + } + } + else + { +- return FALSE; ++ ret = FALSE; + } ++ ++ lt_dlclose( hDLL ); ++ ++ return ret; + } + else + { +@@ -146,17 +159,21 @@ BOOL _SQLDriverConnectPromptW( + { + if ( hODBCInstWnd ) + { +- return pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ ret = pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- return pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); ++ ret = pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); + } + } + else + { +- return FALSE; ++ ret = FALSE; + } ++ ++ lt_dlclose( hDLL ); ++ ++ return ret; + } + } + +-- +2.32.0.windows.2 + diff --git a/unixODBC.spec b/unixODBC.spec index 2e91a4f235c875530838e3695adfedc5e9e7b227..ad93762182b1558e6f2e5f442e3a45c1c6b37d61 100644 --- a/unixODBC.spec +++ b/unixODBC.spec @@ -1,13 +1,12 @@ Name: unixODBC Version: 2.3.7 -Release: 2 +Release: 3 Summary: Open-source project that implements the ODBC API License: GPLv2+ and LGPLv2+ URL: http://www.unixODBC.org/ Source: http://www.unixODBC.org/%{name}-%{version}.tar.gz Source1: odbcinst.ini -Patch0000: so-version-bump.patch -Patch0001: keep-typedefs.patch +Patch0001: 0001-Fix-some-leaks.patch Conflicts: iodbc BuildRequires: automake autoconf libtool libtool-ltdl-devel bison flex readline-devel @@ -26,6 +25,7 @@ Development and header files for %{name} %prep %autosetup -p1 autoreconf -vfi +%patch0001 -p1 %build CFLAGS="%{optflags} -fno-strict-aliasing"