Thomas Faber : dbghelp: Accept NULL search path in SymSetSearchPath.
Alexandre Julliard
julliard at winehq.org
Mon Nov 15 16:01:29 CST 2021
Module: wine
Branch: master
Commit: 06f1c40f17ad09aa7ab72f44c705be78dcf6daf3
URL: https://source.winehq.org/git/wine.git/?a=commit;h=06f1c40f17ad09aa7ab72f44c705be78dcf6daf3
Author: Thomas Faber <thomas.faber at reactos.org>
Date: Fri Nov 12 18:11:48 2021 -0500
dbghelp: Accept NULL search path in SymSetSearchPath.
Fixes a crash when starting kernrate.exe.
Signed-off-by: Thomas Faber <thomas.faber at reactos.org>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dbghelp/dbghelp.c | 87 +++++++++++++++++++++++++++++++-------------------
1 file changed, 54 insertions(+), 33 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c
index c0b8837fbbf..428ea10e2d3 100644
--- a/dlls/dbghelp/dbghelp.c
+++ b/dlls/dbghelp/dbghelp.c
@@ -175,6 +175,36 @@ struct cpu* cpu_find(DWORD machine)
return NULL;
}
+static WCHAR* make_default_search_path(void)
+{
+ WCHAR* search_path;
+ unsigned size;
+ unsigned len;
+
+ search_path = HeapAlloc(GetProcessHeap(), 0, (len = MAX_PATH) * sizeof(WCHAR));
+ while ((size = GetCurrentDirectoryW(len, search_path)) >= len)
+ search_path = HeapReAlloc(GetProcessHeap(), 0, search_path, (len *= 2) * sizeof(WCHAR));
+ search_path = HeapReAlloc(GetProcessHeap(), 0, search_path, (size + 1) * sizeof(WCHAR));
+
+ len = GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", NULL, 0);
+ if (len)
+ {
+ search_path = HeapReAlloc(GetProcessHeap(), 0, search_path, (size + 1 + len + 1) * sizeof(WCHAR));
+ search_path[size] = ';';
+ GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", search_path + size + 1, len);
+ size += 1 + len;
+ }
+ len = GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", NULL, 0);
+ if (len)
+ {
+ search_path = HeapReAlloc(GetProcessHeap(), 0, search_path, (size + 1 + len + 1) * sizeof(WCHAR));
+ search_path[size] = ';';
+ GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", search_path + size + 1, len);
+ }
+
+ return search_path;
+}
+
/******************************************************************
* SymSetSearchPathW (DBGHELP.@)
*
@@ -182,14 +212,24 @@ struct cpu* cpu_find(DWORD machine)
BOOL WINAPI SymSetSearchPathW(HANDLE hProcess, PCWSTR searchPath)
{
struct process* pcs = process_find_by_handle(hProcess);
+ WCHAR* search_path_buffer;
if (!pcs) return FALSE;
- if (!searchPath) return FALSE;
+ if (searchPath)
+ {
+ search_path_buffer = HeapAlloc(GetProcessHeap(), 0,
+ (lstrlenW(searchPath) + 1) * sizeof(WCHAR));
+ if (!search_path_buffer) return FALSE;
+ lstrcpyW(search_path_buffer, searchPath);
+ }
+ else
+ {
+ search_path_buffer = make_default_search_path();
+ if (!search_path_buffer) return FALSE;
+ }
HeapFree(GetProcessHeap(), 0, pcs->search_path);
- pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,
- (lstrlenW(searchPath) + 1) * sizeof(WCHAR)),
- searchPath);
+ pcs->search_path = search_path_buffer;
return TRUE;
}
@@ -201,16 +241,19 @@ BOOL WINAPI SymSetSearchPath(HANDLE hProcess, PCSTR searchPath)
{
BOOL ret = FALSE;
unsigned len;
- WCHAR* sp;
+ WCHAR* sp = NULL;
- len = MultiByteToWideChar(CP_ACP, 0, searchPath, -1, NULL, 0);
- if ((sp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ if (searchPath)
{
+ len = MultiByteToWideChar(CP_ACP, 0, searchPath, -1, NULL, 0);
+ sp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (!sp) return FALSE;
MultiByteToWideChar(CP_ACP, 0, searchPath, -1, sp, len);
-
- ret = SymSetSearchPathW(hProcess, sp);
- HeapFree(GetProcessHeap(), 0, sp);
}
+
+ ret = SymSetSearchPathW(hProcess, sp);
+
+ HeapFree(GetProcessHeap(), 0, sp);
return ret;
}
@@ -428,29 +471,7 @@ BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeP
}
else
{
- unsigned size;
- unsigned len;
-
- pcs->search_path = HeapAlloc(GetProcessHeap(), 0, (len = MAX_PATH) * sizeof(WCHAR));
- while ((size = GetCurrentDirectoryW(len, pcs->search_path)) >= len)
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (len *= 2) * sizeof(WCHAR));
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1) * sizeof(WCHAR));
-
- len = GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", NULL, 0);
- if (len)
- {
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR));
- pcs->search_path[size] = ';';
- GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", pcs->search_path + size + 1, len);
- size += 1 + len;
- }
- len = GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", NULL, 0);
- if (len)
- {
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR));
- pcs->search_path[size] = ';';
- GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", pcs->search_path + size + 1, len);
- }
+ pcs->search_path = make_default_search_path();
}
pcs->lmodules = NULL;
More information about the wine-cvs
mailing list