Module: wine Branch: master Commit: 63718306e92e7415dcf483192ed35555ae059596 URL: https://gitlab.winehq.org/wine/wine/-/commit/63718306e92e7415dcf483192ed3555...
Author: Hans Leidekker hans@codeweavers.com Date: Wed Jul 10 12:03:44 2024 +0200
odbc32: Handle options in SQLFreeStmt().
---
dlls/odbc32/proxyodbc.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index d1c1a7cfadd..5dc8e8649ce 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -1377,17 +1377,23 @@ SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle) return ret; }
-static void free_bindings( struct handle *handle ) +static void free_col_bindings( struct handle *handle ) { if (handle->bind_col.param) { free( handle->bind_col.param->len ); free( handle->bind_col.param ); + handle->bind_col.param = NULL; } +} + +static void free_param_bindings( struct handle *handle ) +{ if (handle->bind_parameter.param) { free( handle->bind_parameter.param->len ); free( handle->bind_parameter.param ); + handle->bind_parameter.param = NULL; } }
@@ -1407,7 +1413,6 @@ SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) { struct SQLFreeHandle_params params = { HandleType, handle->unix_handle }; ret = ODBC_CALL( SQLFreeHandle, ¶ms ); - free_bindings( handle ); } else if (handle->win32_handle) { @@ -1416,6 +1421,8 @@ SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle)
RegCloseKey( handle->drivers_key ); RegCloseKey( handle->sources_key ); + free_col_bindings( handle ); + free_param_bindings( handle ); free( handle );
TRACE("Returning %d\n", ret); @@ -1438,14 +1445,32 @@ SQLRETURN WINAPI SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) { struct SQLFreeStmt_params params = { handle->unix_handle, Option }; ret = ODBC_CALL( SQLFreeStmt, ¶ms ); - free_bindings( handle ); } else if (handle->win32_handle) { ret = handle->win32_funcs->SQLFreeStmt( handle->win32_handle, Option ); }
- free( handle ); + switch (Option) + { + case SQL_CLOSE: + break; + + case SQL_UNBIND: + free_col_bindings( handle ); + break; + + case SQL_RESET_PARAMS: + free_param_bindings( handle ); + break; + + case SQL_DROP: + default: + free_col_bindings( handle ); + free_param_bindings( handle ); + free( handle ); + break; + }
TRACE("Returning %d\n", ret); return ret;