On Thu, Apr 13, 2017 at 01:06:50AM +0000, Alistair Leslie-Hughes wrote:
> +static BOOL write_config_value(const WCHAR *driver, const WCHAR *args)
> +{
> + long ret;
> + HKEY hkey;
> +
> + if (!args)
> + return FALSE;
> +
> + if ((ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, odbcini, &hkey)) == ERROR_SUCCESS)
> + {
> + HKEY hkeydriver;
> +
> + if ((ret = RegOpenKeyW(hkey, driver, &hkeydriver)) == ERROR_SUCCESS)
> + {
> + WCHAR *divider, *value;
> +
> + WCHAR *name = heap_alloc( (strlenW(args) + 1) * sizeof(WCHAR));
> + if(!name)
> + {
> + push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem);
> + return FALSE;
You're returning without closing the registry keys. You may want to change
the error handling to a 'goto fail;' type behaviour.
> diff --git a/dlls/odbccp32/tests/misc.c b/dlls/odbccp32/tests/misc.c
> index ed8e6f1..e5a8896 100644
> --- a/dlls/odbccp32/tests/misc.c
> +++ b/dlls/odbccp32/tests/misc.c
...
> +
> ret = SQLInstallDriverEx("WINE ODBC Driver Path\0Driver=sample.dll\0Setup=sample.dll\0\0", "c:\\temp", path, MAX_PATH, &size, ODBC_INSTALL_COMPLETE, NULL);
> + ok(ret, "SQLInstallDriverEx failed\n");
> sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
> - ok(sql_ret && error_code == SQL_SUCCESS, "SQLInstallDriverEx failed %d, %u\n", sql_ret, error_code);
> + ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLInstallDriverEx failed %d, %u\n", sql_ret, error_code);
> ok(!strcmp(path, "c:\\temp"), "invalid path %s\n", path);
>
> + ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver Path", "NoWrite=60;xxxx=555", error, sizeof(error), NULL);
> + ok(ret, "SQLConfigDriver failed\n");
> + sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
> + ok(sql_ret == SQL_NO_DATA || (sql_ret && error_code == SQL_SUCCESS), "SQLConfigDriver failed %d, %u\n", sql_ret, error_code);
> +
> + ret = SQLConfigDriver(NULL, ODBC_CONFIG_DRIVER, "WINE ODBC Driver Path", "empty", error, sizeof(error), NULL);
> + ok(!ret, "SQLConfigDriver successed\n");
> + sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL);
> + ok(sql_ret && error_code == ODBC_ERROR_INVALID_KEYWORD_VALUE, "SQLConfigDriver failed %d, %u\n", sql_ret, error_code);
> +
> if (ret)
> {
This entire block is now skipped if things proceed as expected...
Also, 'successed' is not a word ;-)
Huw.