From 5a586ba5cb510480d0851540778d6c84c98cdcf9 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Sat, 15 Jun 2024 14:38:32 +1000 Subject: [PATCH] Added odbccp32-SQLWritePrivateProfileStringW patchset --- ...32-Support-System-wide-ODBC-DSN-keys.patch | 50 +++++++++++++++ ...ePrivateProfileStringW-check-for-exi.patch | 63 +++++++++++++++++++ .../definition | 4 ++ 3 files changed, 117 insertions(+) create mode 100644 patches/odbccp32-SQLWritePrivateProfileStringW/0001-odbccp32-Support-System-wide-ODBC-DSN-keys.patch create mode 100644 patches/odbccp32-SQLWritePrivateProfileStringW/0002-odbccp32-SQLWritePrivateProfileStringW-check-for-exi.patch create mode 100644 patches/odbccp32-SQLWritePrivateProfileStringW/definition diff --git a/patches/odbccp32-SQLWritePrivateProfileStringW/0001-odbccp32-Support-System-wide-ODBC-DSN-keys.patch b/patches/odbccp32-SQLWritePrivateProfileStringW/0001-odbccp32-Support-System-wide-ODBC-DSN-keys.patch new file mode 100644 index 00000000..ce56e719 --- /dev/null +++ b/patches/odbccp32-SQLWritePrivateProfileStringW/0001-odbccp32-Support-System-wide-ODBC-DSN-keys.patch @@ -0,0 +1,50 @@ +From bea6b99a50c4de12c03d6dd68e9f246b854f9550 Mon Sep 17 00:00:00 2001 +From: Alistair Leslie-Hughes +Date: Sat, 8 Jun 2024 10:24:40 +1000 +Subject: [PATCH 1/2] odbccp32: Support System wide ODBC DSN keys + +--- + dlls/odbccp32/odbccp32.c | 22 ++++++++++++++-------- + 1 file changed, 14 insertions(+), 8 deletions(-) + +diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c +index 95bfb90781e..7846f29584f 100644 +--- a/dlls/odbccp32/odbccp32.c ++++ b/dlls/odbccp32/odbccp32.c +@@ -713,19 +713,25 @@ BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout) + + static HKEY get_privateprofile_sectionkey(LPCWSTR section, LPCWSTR filename) + { +- HKEY hkey, hkeyfilename, hkeysection; ++ HKEY hkeysection; + LONG ret; ++ WCHAR *regpath; + +- if (RegOpenKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) ++ regpath = malloc ( (wcslen(L"Software\\ODBC\\") + wcslen(filename) + wcslen(L"\\") ++ + wcslen(section) + 1) * sizeof(WCHAR)); ++ if (!regpath) + return NULL; + +- ret = RegOpenKeyW(hkey, filename, &hkeyfilename); +- RegCloseKey(hkey); +- if (ret) +- return NULL; ++ wcscpy(regpath, L"Software\\ODBC\\"); ++ wcscat(regpath, filename); ++ wcscat(regpath, L"\\"); ++ wcscat(regpath, section); + +- ret = RegOpenKeyW(hkeyfilename, section, &hkeysection); +- RegCloseKey(hkeyfilename); ++ if ((ret = RegOpenKeyW(HKEY_CURRENT_USER, regpath, &hkeysection)) != ERROR_SUCCESS) ++ { ++ ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, regpath, &hkeysection); ++ } ++ free(regpath); + + return ret ? NULL : hkeysection; + } +-- +2.43.0 + diff --git a/patches/odbccp32-SQLWritePrivateProfileStringW/0002-odbccp32-SQLWritePrivateProfileStringW-check-for-exi.patch b/patches/odbccp32-SQLWritePrivateProfileStringW/0002-odbccp32-SQLWritePrivateProfileStringW-check-for-exi.patch new file mode 100644 index 00000000..94e965a8 --- /dev/null +++ b/patches/odbccp32-SQLWritePrivateProfileStringW/0002-odbccp32-SQLWritePrivateProfileStringW-check-for-exi.patch @@ -0,0 +1,63 @@ +From e7ef9385cd21edecf8229f85e7c4a8f5436164c0 Mon Sep 17 00:00:00 2001 +From: Alistair Leslie-Hughes +Date: Sat, 8 Jun 2024 15:08:08 +1000 +Subject: [PATCH 2/2] odbccp32: SQLWritePrivateProfileStringW check for + existing DSN first + +If a DSN is System wide, we need to write to the HKEY_LOCAL_MACHINE +part of the registry not HKEY_CURRENT_USER which it's currently doing. +--- + dlls/odbccp32/odbccp32.c | 30 +++++++++++++++++++++++++++++- + 1 file changed, 29 insertions(+), 1 deletion(-) + +diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c +index 7846f29584f..470bc170618 100644 +--- a/dlls/odbccp32/odbccp32.c ++++ b/dlls/odbccp32/odbccp32.c +@@ -1810,6 +1810,7 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry + static const WCHAR empty[] = {0}; + LONG ret; + HKEY hkey; ++ WCHAR *regpath; + + clear_errors(); + TRACE("%s %s %s %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry), +@@ -1821,7 +1822,34 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry + return FALSE; + } + +- if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) == ERROR_SUCCESS) ++ regpath = malloc ( (wcslen(L"Software\\ODBC\\") + wcslen(lpszFilename) + wcslen(L"\\") ++ + wcslen(lpszSection) + 1) * sizeof(WCHAR)); ++ if (!regpath) ++ { ++ push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); ++ return FALSE; ++ } ++ wcscpy(regpath, L"Software\\ODBC\\"); ++ wcscat(regpath, lpszFilename); ++ wcscat(regpath, L"\\"); ++ wcscat(regpath, lpszSection); ++ ++ /* Check an existing key first before writing a new one */ ++ if ((ret = RegOpenKeyW(HKEY_CURRENT_USER, regpath, &hkey)) != ERROR_SUCCESS) ++ { ++ ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, regpath, &hkey); ++ } ++ free(regpath); ++ ++ if (ret == ERROR_SUCCESS) ++ { ++ if(lpszString) ++ ret = RegSetValueExW(hkey, lpszEntry, 0, REG_SZ, (BYTE*)lpszString, (lstrlenW(lpszString)+1)*sizeof(WCHAR)); ++ else ++ ret = RegSetValueExW(hkey, lpszEntry, 0, REG_SZ, (BYTE*)empty, sizeof(empty)); ++ RegCloseKey(hkey); ++ } ++ else if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) == ERROR_SUCCESS) + { + HKEY hkeyfilename; + +-- +2.43.0 + diff --git a/patches/odbccp32-SQLWritePrivateProfileStringW/definition b/patches/odbccp32-SQLWritePrivateProfileStringW/definition new file mode 100644 index 00000000..3b16c37d --- /dev/null +++ b/patches/odbccp32-SQLWritePrivateProfileStringW/definition @@ -0,0 +1,4 @@ +Fixes: [56786] odbccp32: Correct lookup of DSN before writing to registry. + +#PR: https://gitlab.winehq.org/wine/wine/-/merge_requests/5812 +