diff --git a/0001-Fix-some-leaks.patch b/0001-Fix-some-leaks.patch new file mode 100644 index 0000000000000000000000000000000000000000..ebe69da1e322b162854d43a8990ff5310826a8dc --- /dev/null +++ b/0001-Fix-some-leaks.patch @@ -0,0 +1,433 @@ +diff -rNu unixODBC-2.3.7-revised/cur/SQLAllocStmt.c unixODBC-2.3.7/cur/SQLAllocStmt.c +--- unixODBC-2.3.7-revised/cur/SQLAllocStmt.c 2021-11-05 16:23:24.000000000 +0800 ++++ unixODBC-2.3.7/cur/SQLAllocStmt.c 2018-02-26 22:50:10.000000000 +0800 +@@ -83,7 +83,7 @@ + LOG_INFO, + "Error: IM001" ); + +- cl_connection -> dh.__post_internal_error( &connection -> error, ++ cl_statement -> cl_connection -> dh.__post_internal_error( &connection -> error, + ERROR_HY001, NULL, + connection -> environment -> requested_version ); + +diff -rNu unixODBC-2.3.7-revised/cur/SQLConnect.c unixODBC-2.3.7/cur/SQLConnect.c +--- unixODBC-2.3.7-revised/cur/SQLConnect.c 2021-11-05 16:23:59.000000000 +0800 ++++ unixODBC-2.3.7/cur/SQLConnect.c 2018-02-26 22:50:10.000000000 +0800 +@@ -299,8 +299,6 @@ + cl_connection -> dh.__post_internal_error( &connection -> error, + ERROR_HY001, NULL, + connection -> environment -> requested_version ); +- +- free( cl_connetion ); + return SQL_ERROR; + } + +diff -rNu unixODBC-2.3.7-revised/DriverManager/SQLCancel.c unixODBC-2.3.7/DriverManager/SQLCancel.c +--- unixODBC-2.3.7-revised/DriverManager/SQLCancel.c 2021-11-05 16:21:33.000000000 +0800 ++++ unixODBC-2.3.7/DriverManager/SQLCancel.c 2018-05-30 17:24:07.000000000 +0800 +@@ -236,8 +236,18 @@ + else if ( statement -> interupted_func == + SQL_API_SQLBULKOPERATIONS ) + { +- statement -> state = STATE_S6; +- statement -> eod = 0; ++ 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; ++ } + } + else if ( statement -> interupted_func == + SQL_API_SQLSETPOS ) +diff -rNu unixODBC-2.3.7-revised/DriverManager/SQLCancelHandle.c unixODBC-2.3.7/DriverManager/SQLCancelHandle.c +--- unixODBC-2.3.7-revised/DriverManager/SQLCancelHandle.c 2021-11-05 16:22:12.000000000 +0800 ++++ unixODBC-2.3.7/DriverManager/SQLCancelHandle.c 2018-05-30 17:24:07.000000000 +0800 +@@ -140,8 +140,18 @@ + else if ( statement -> interupted_func == + SQL_API_SQLBULKOPERATIONS ) + { +- statement -> state = STATE_S6; +- statement -> eod = 0; ++ 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; ++ } + } + else if ( statement -> interupted_func == + SQL_API_SQLSETPOS ) +diff -rNu unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOption.c unixODBC-2.3.7/DriverManager/SQLGetConnectOption.c +--- unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOption.c 2021-11-05 16:22:40.000000000 +0800 ++++ unixODBC-2.3.7/DriverManager/SQLGetConnectOption.c 2018-05-30 17:24:07.000000000 +0800 +@@ -171,7 +171,14 @@ + { + if ( value ) + { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ if ( log_info.log_flag ) ++ { ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ } ++ else ++ { ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ } + } + + return SQL_SUCCESS; +diff -rNu unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOptionW.c unixODBC-2.3.7/DriverManager/SQLGetConnectOptionW.c +--- unixODBC-2.3.7-revised/DriverManager/SQLGetConnectOptionW.c 2021-11-05 16:23:01.000000000 +0800 ++++ unixODBC-2.3.7/DriverManager/SQLGetConnectOptionW.c 2018-05-30 17:24:07.000000000 +0800 +@@ -110,7 +110,14 @@ + { + if ( value ) + { +- *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ if ( log_info.log_flag ) ++ { ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ } ++ else ++ { ++ *((SQLINTEGER*)value) = SQL_OPT_TRACE_ON; ++ } + } + + return SQL_SUCCESS; +diff -rNu unixODBC-2.3.7-revised/odbcinst/ODBCINSTConstructProperties.c unixODBC-2.3.7/odbcinst/ODBCINSTConstructProperties.c +--- unixODBC-2.3.7-revised/odbcinst/ODBCINSTConstructProperties.c 2021-11-05 16:25:19.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/ODBCINSTConstructProperties.c 2015-01-23 18:32:51.000000000 +0800 +@@ -244,8 +244,6 @@ + /* APPEND OTHERS */ + pODBCINSTGetProperties( hLastProperty ); + +- lt_dlclose( hDLL ); +- + return ODBCINST_SUCCESS; + } + +diff -rNu unixODBC-2.3.7-revised/odbcinst/SQLConfigDriver.c unixODBC-2.3.7/odbcinst/SQLConfigDriver.c +--- unixODBC-2.3.7-revised/odbcinst/SQLConfigDriver.c 2021-11-05 16:26:47.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/SQLConfigDriver.c 2015-01-23 18:31:25.000000000 +0800 +@@ -24,6 +24,7 @@ + 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 * ); +@@ -35,6 +36,7 @@ + *iswide = 0; + + /* SANITY CHECKS */ ++ nReturn = FALSE; + if ( pszDriver == NULL ) + { + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_NAME, "" ); +@@ -107,17 +109,14 @@ + pConfigDriverW = (BOOL (*)(HWND, WORD, LPCWSTR, LPCWSTR, LPCWSTR, WORD, WORD * )) lt_dlsym( hDLL, "ConfigDriverW" ); + /* if ( lt_dlerror() == NULL ) */ + if ( pConfigDriver ) +- (void) pConfigDriver( hWnd, nRequest, pszDriver, pszArgs, pszMsg, nMsgMax, pnMsgOut); ++ nReturn = pConfigDriver( hWnd, nRequest, pszDriver, pszArgs, pszMsg, nMsgMax, pnMsgOut); + else if ( pConfigDriverW ) + { +- (void) pConfigDriverW( hWnd, nRequest, pszDriverW, pszArgsW, pszMsgW, nMsgMax, pnMsgOut); ++ nReturn = 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 -rNu unixODBC-2.3.7-revised/odbcinst/SQLCreateDataSource.c unixODBC-2.3.7/odbcinst/SQLCreateDataSource.c +--- unixODBC-2.3.7-revised/odbcinst/SQLCreateDataSource.c 2021-11-05 16:31:48.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/SQLCreateDataSource.c 2018-06-28 19:13:00.000000000 +0800 +@@ -242,18 +242,10 @@ + { + /* change the name, as it avoids it finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND, LPCSTR))lt_dlsym( hDLL, "ODBCCreateDataSource" ); +- +- if ( pSQLCreateDataSource ) { +- BOOL ret; +- +- ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLCreateDataSource ) ++ return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +- lt_dlclose( hDLL ); + } + else + { +@@ -264,18 +256,10 @@ + { + /* change the name, as it avoids linker finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND,LPCSTR))lt_dlsym( hDLL, "ODBCCreateDataSource" ); +- +- if ( pSQLCreateDataSource ) { +- BOOL ret; +- +- ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLCreateDataSource ) ++ return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), pszDS ); + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +- lt_dlclose( hDLL ); + } + } + +@@ -324,17 +308,10 @@ + { + /* change the name, as it avoids it finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND, LPCWSTR))lt_dlsym( hDLL, "ODBCCreateDataSourceW" ); +- if ( pSQLCreateDataSource ) { +- BOOL ret; +- +- ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLCreateDataSource ) ++ return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +- lt_dlclose( hDLL ); + } + else + { +@@ -345,17 +322,10 @@ + { + /* change the name, as it avoids linker finding it in the calling lib */ + pSQLCreateDataSource = (BOOL (*)(HWND,LPCWSTR))lt_dlsym( hDLL, "ODBCCreateDataSourceW" ); +- if ( pSQLCreateDataSource ) { +- BOOL ret; +- +- ret = pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLCreateDataSource ) ++ return pSQLCreateDataSource( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), lpszDSN ); + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +- lt_dlclose( hDLL ); + } + } + +diff -rNu unixODBC-2.3.7-revised/odbcinst/_SQLDriverConnectPrompt.c unixODBC-2.3.7/odbcinst/_SQLDriverConnectPrompt.c +--- unixODBC-2.3.7-revised/odbcinst/_SQLDriverConnectPrompt.c 2021-11-05 16:40:43.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/_SQLDriverConnectPrompt.c 2018-04-03 18:34:02.000000000 +0800 +@@ -12,7 +12,6 @@ + char szPathAndName[FILENAME_MAX]; + void * hDLL; + BOOL (*pODBCDriverConnectPrompt)(HWND, SQLCHAR *, SQLSMALLINT ); +- BOOL ret; + + /* initialize libtool */ + if ( lt_dlinit() ) +@@ -41,21 +40,17 @@ + { + if ( hODBCInstWnd ) + { +- ret = pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ return pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- ret = pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); ++ return pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); + } + } + else + { +- ret = FALSE; ++ return FALSE; + } +- +- lt_dlclose( hDLL ); +- +- return ret; + } + else + { +@@ -70,20 +65,17 @@ + { + if ( hODBCInstWnd ) + { +- ret = pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ return pODBCDriverConnectPrompt(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- ret = pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); ++ return pODBCDriverConnectPrompt( NULL, dsn, len_dsn ); + } + } + else + { +- ret = FALSE; ++ return FALSE; + } +- +- lt_dlclose( hDLL ); +- return ret; + } + } + +@@ -101,7 +93,6 @@ + char szPathAndName[FILENAME_MAX]; + void * hDLL; + BOOL (*pODBCDriverConnectPromptW)(HWND, SQLWCHAR *, SQLSMALLINT ); +- BOOL ret; + + /* initialize libtool */ + if ( lt_dlinit() ) +@@ -130,20 +121,17 @@ + { + if ( hODBCInstWnd ) + { +- ret = pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ return pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- ret = pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); ++ return pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); + } + } + else + { +- ret = FALSE; ++ return FALSE; + } +- +- lt_dlclose( hDLL ); +- return ret; + } + else + { +@@ -158,20 +146,17 @@ + { + if ( hODBCInstWnd ) + { +- ret = pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); ++ return pODBCDriverConnectPromptW(( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ), dsn, len_dsn ); + } + else + { +- ret = pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); ++ return pODBCDriverConnectPromptW( NULL, dsn, len_dsn ); + } + } + else + { +- ret = FALSE; ++ return FALSE; + } +- +- lt_dlclose( hDLL ); +- return ret; + } + } + +diff -rNu unixODBC-2.3.7-revised/odbcinst/SQLManageDataSources.c unixODBC-2.3.7/odbcinst/SQLManageDataSources.c +--- unixODBC-2.3.7-revised/odbcinst/SQLManageDataSources.c 2021-11-05 16:36:24.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/SQLManageDataSources.c 2018-03-28 17:04:04.000000000 +0800 +@@ -153,16 +153,10 @@ + { + /* change the name (SQLManageDataSources to ODBCManageDataSources) to prevent us from calling ourself */ + pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "ODBCManageDataSources" ); +- if ( pSQLManageDataSources ) { +- BOOL ret; +- ret = pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLManageDataSources ) ++ return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); + else + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() ); +- lt_dlclose( hDLL ); + } + else + { +@@ -175,17 +169,10 @@ + /* 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 ) { +- BOOL ret; +- +- ret = pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); +- +- lt_dlclose( hDLL ); +- return ret; +- } ++ if ( pSQLManageDataSources ) ++ return pSQLManageDataSources( ( *(hODBCInstWnd->szUI) ? hODBCInstWnd->hWnd : NULL ) ); + 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 -rNu unixODBC-2.3.7-revised/odbcinst/SQLReadFileDSN.c unixODBC-2.3.7/odbcinst/SQLReadFileDSN.c +--- unixODBC-2.3.7-revised/odbcinst/SQLReadFileDSN.c 2021-11-05 16:37:43.000000000 +0800 ++++ unixODBC-2.3.7/odbcinst/SQLReadFileDSN.c 2014-01-06 17:37:02.000000000 +0800 +@@ -87,6 +87,7 @@ + WORD *pnString ) + { + HINI hIni; ++ int nBufPos = 0; + char szValue[INI_MAX_PROPERTY_VALUE+1]; + char szFileName[ODBC_FILENAME_MAX+1]; + +@@ -185,10 +186,6 @@ + inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, + ODBC_ERROR_REQUEST_FAILED, "" ); + +- if ( pszFileName ) +- { +- iniClose( hIni ); +- } + return FALSE; + } + else +@@ -196,6 +193,7 @@ + iniValue( hIni, szValue ); + strncpy( pszString, szValue, nString ); + pszString[ nString - 1 ] = '\0'; ++ nBufPos = strlen( szValue ); + } + } 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"