diff --git a/fix_leaks.patch b/fix_leaks.patch new file mode 100644 index 0000000000000000000000000000000000000000..e2b0f4ebf70fafeb72c92a99078e5a06c334dae7 --- /dev/null +++ b/fix_leaks.patch @@ -0,0 +1,443 @@ +diff -uprN unixODBC-2.3.7/cur/SQLAllocStmt.c unixODBC-2.3.7-revised/cur/SQLAllocStmt.c +--- unixODBC-2.3.7/cur/SQLAllocStmt.c 2018-02-26 22:50:10.000000000 +0800 ++++ unixODBC-2.3.7-revised/cur/SQLAllocStmt.c 2021-11-05 16:23:24.000000000 +0800 +@@ -83,7 +83,7 @@ SQLRETURN CLAllocStmt( SQLHDBC connectio + 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 -uprN unixODBC-2.3.7/cur/SQLConnect.c unixODBC-2.3.7-revised/cur/SQLConnect.c +--- unixODBC-2.3.7/cur/SQLConnect.c 2018-02-26 22:50:10.000000000 +0800 ++++ unixODBC-2.3.7-revised/cur/SQLConnect.c 2021-11-05 16:23:59.000000000 +0800 +@@ -299,6 +299,8 @@ SQLRETURN CLConnect( DMHDBC connection, + cl_connection -> dh.__post_internal_error( &connection -> error, + ERROR_HY001, NULL, + connection -> environment -> requested_version ); ++ ++ free( cl_connection ); + return SQL_ERROR; + } + +diff -uprN unixODBC-2.3.7/DriverManager/SQLCancel.c unixODBC-2.3.7-revised/DriverManager/SQLCancel.c +--- unixODBC-2.3.7/DriverManager/SQLCancel.c 2018-05-30 17:24:07.000000000 +0800 ++++ unixODBC-2.3.7-revised/DriverManager/SQLCancel.c 2021-11-05 16:21:33.000000000 +0800 +@@ -236,18 +236,8 @@ SQLRETURN SQLCancel( SQLHSTMT statement_ + 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 -uprN unixODBC-2.3.7/DriverManager/SQLCancelHandle.c unixODBC-2.3.7-revised/DriverManager/SQLCancelHandle.c +--- unixODBC-2.3.7/DriverManager/SQLCancelHandle.c 2018-05-30 17:24:07.000000000 +0800 ++++ unixODBC-2.3.7-revised/DriverManager/SQLCancelHandle.c 2021-11-05 16:22:12.000000000 +0800 +@@ -140,18 +140,8 @@ SQLRETURN SQLCancelHandle( SQLSMALLINT H + 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 -uprN unixODBC-2.3.7/DriverManager/SQLGetConnectOption.c unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOption.c +--- unixODBC-2.3.7/DriverManager/SQLGetConnectOption.c 2018-05-30 17:24:07.000000000 +0800 ++++ unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOption.c 2021-11-05 16:22:40.000000000 +0800 +@@ -171,14 +171,7 @@ SQLRETURN SQLGetConnectOption( SQLHDBC c + { + 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 -uprN unixODBC-2.3.7/DriverManager/SQLGetConnectOptionW.c unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOptionW.c +--- unixODBC-2.3.7/DriverManager/SQLGetConnectOptionW.c 2018-05-30 17:24:07.000000000 +0800 ++++ unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOptionW.c 2021-11-05 16:23:01.000000000 +0800 +@@ -110,14 +110,7 @@ SQLRETURN SQLGetConnectOptionW( SQLHDBC + { + 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 -uprN unixODBC-2.3.7/odbcinst/ODBCINSTConstructProperties.c unixODBC-2.3.7-revised/odbcinst/ODBCINSTConstructProperties.c +--- unixODBC-2.3.7/odbcinst/ODBCINSTConstructProperties.c 2015-01-23 18:32:51.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/ODBCINSTConstructProperties.c 2021-11-05 16:25:19.000000000 +0800 +@@ -244,6 +244,8 @@ int ODBCINSTConstructProperties( char *p + /* APPEND OTHERS */ + pODBCINSTGetProperties( hLastProperty ); + ++ lt_dlclose( hDLL ); ++ + return ODBCINST_SUCCESS; + } + +diff -uprN unixODBC-2.3.7/odbcinst/SQLConfigDriver.c unixODBC-2.3.7-revised/odbcinst/SQLConfigDriver.c +--- unixODBC-2.3.7/odbcinst/SQLConfigDriver.c 2015-01-23 18:31:25.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/SQLConfigDriver.c 2021-11-05 16:26:47.000000000 +0800 +@@ -24,7 +24,6 @@ static BOOL SQLConfigDriverWide( HWND hW + 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 hW + *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 hW + 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 -uprN unixODBC-2.3.7/odbcinst/SQLCreateDataSource.c unixODBC-2.3.7-revised/odbcinst/SQLCreateDataSource.c +--- unixODBC-2.3.7/odbcinst/SQLCreateDataSource.c 2018-06-28 19:13:00.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/SQLCreateDataSource.c 2021-11-05 16:31:48.000000000 +0800 +@@ -242,10 +242,18 @@ BOOL SQLCreateDataSource( HWND hWnd, LPC + { + /* 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 +264,18 @@ BOOL SQLCreateDataSource( HWND hWnd, LPC + { + /* 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 +324,17 @@ BOOL INSTAPI SQLCreateDataSourceW( HWND + { + /* 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 +345,17 @@ BOOL INSTAPI SQLCreateDataSourceW( HWND + { + /* 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 -uprN unixODBC-2.3.7/odbcinst/_SQLDriverConnectPrompt.c unixODBC-2.3.7-revised/odbcinst/_SQLDriverConnectPrompt.c +--- unixODBC-2.3.7/odbcinst/_SQLDriverConnectPrompt.c 2018-04-03 18:34:02.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/_SQLDriverConnectPrompt.c 2021-11-05 16:40:43.000000000 +0800 +@@ -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,20 @@ 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 +158,20 @@ 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; + } + } + +diff -uprN unixODBC-2.3.7/odbcinst/SQLManageDataSources.c unixODBC-2.3.7-revised/odbcinst/SQLManageDataSources.c +--- unixODBC-2.3.7/odbcinst/SQLManageDataSources.c 2018-03-28 17:04:04.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/SQLManageDataSources.c 2021-11-05 16:36:24.000000000 +0800 +@@ -153,10 +153,16 @@ 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 +175,17 @@ 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 -uprN unixODBC-2.3.7/odbcinst/SQLReadFileDSN.c unixODBC-2.3.7-revised/odbcinst/SQLReadFileDSN.c +--- unixODBC-2.3.7/odbcinst/SQLReadFileDSN.c 2014-01-06 17:37:02.000000000 +0800 ++++ unixODBC-2.3.7-revised/odbcinst/SQLReadFileDSN.c 2021-11-05 16:37:43.000000000 +0800 +@@ -87,7 +87,6 @@ BOOL SQLReadFileDSN( LPCSTR + WORD *pnString ) + { + HINI hIni; +- int nBufPos = 0; + char szValue[INI_MAX_PROPERTY_VALUE+1]; + char szFileName[ODBC_FILENAME_MAX+1]; + +@@ -186,6 +185,10 @@ BOOL SQLReadFileDSN( LPCSTR + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, + ODBC_ERROR_REQUEST_FAILED, "" ); + ++ if ( pszFileName ) ++ { ++ iniClose( hIni ); ++ } + return FALSE; + } + else +@@ -193,7 +196,6 @@ BOOL SQLReadFileDSN( LPCSTR + iniValue( hIni, szValue ); + strncpy( pszString, szValue, nString ); + pszString[ nString - 1 ] = '\0'; +- nBufPos = strlen( szValue ); + } + } + +diff -uprN unixODBC-2.3.7/.vscode/settings.json unixODBC-2.3.7-revised/.vscode/settings.json +--- unixODBC-2.3.7/.vscode/settings.json 1970-01-01 08:00:00.000000000 +0800 ++++ unixODBC-2.3.7-revised/.vscode/settings.json 2021-11-05 16:20:50.000000000 +0800 +@@ -0,0 +1,4 @@ ++{ ++ "C_Cpp.autocomplete": "Disabled", ++ "C_Cpp.intelliSenseEngine": "Disabled" ++} +\ No newline at end of file diff --git a/unixODBC.spec b/unixODBC.spec index 2e91a4f235c875530838e3695adfedc5e9e7b227..3f615f5451c39b6a5386c490ad31d4ec3d6257c1 100644 --- a/unixODBC.spec +++ b/unixODBC.spec @@ -1,6 +1,6 @@ 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/ @@ -8,6 +8,7 @@ Source: http://www.unixODBC.org/%{name}-%{version}.tar.gz Source1: odbcinst.ini Patch0000: so-version-bump.patch Patch0001: keep-typedefs.patch +Patch0002: fix_leaks.patch Conflicts: iodbc BuildRequires: automake autoconf libtool libtool-ltdl-devel bison flex readline-devel @@ -90,5 +91,8 @@ find doc -name 'Makefile*' | xargs rm %exclude %{_datadir}/libtool %changelog +* Mon Nov 8 2021 Haoran Yang - 2.3.7-3 +- fix some leaks and eliminate duplicated code + * Tue Nov 5 2019 Lijin Yang - 1.1.0-14 - Package init