Module: wine Branch: master Commit: ca49552f646bf30b492da4668745f9f65b9de18d URL: https://source.winehq.org/git/wine.git/?a=commit;h=ca49552f646bf30b492da4668...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Mar 23 16:16:27 2020 +0100
dbghelp: Introduce search_unix_path helper and use it in elf_search_and_load_file.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dbghelp/dbghelp_private.h | 1 + dlls/dbghelp/elf_module.c | 49 +++--------------------------------------- dlls/dbghelp/path.c | 43 ++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 46 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index e846d21054..9415881c57 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -671,6 +671,7 @@ extern BOOL path_find_symbol_file(const struct process* pcs, const struc WCHAR *buffer, BOOL* is_unmatched) DECLSPEC_HIDDEN; extern WCHAR *get_dos_file_name(const WCHAR *filename) DECLSPEC_HIDDEN; extern BOOL search_dll_path(const WCHAR *name, BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN; +extern BOOL search_unix_path(const WCHAR *name, const char *path, BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN; extern const WCHAR* file_name(const WCHAR* str) DECLSPEC_HIDDEN; extern const char* file_nameA(const char* str) DECLSPEC_HIDDEN;
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c index 0433bf77e0..0b60524fc4 100644 --- a/dlls/dbghelp/elf_module.c +++ b/dlls/dbghelp/elf_module.c @@ -1274,47 +1274,6 @@ static BOOL elf_load_file_cb(void *param, HANDLE handle, const WCHAR *filename) return elf_load_file(load_file->process, filename, load_file->load_offset, load_file->dyn_addr, load_file->elf_info); }
-/****************************************************************** - * elf_load_file_from_path - * tries to load an ELF file from a set of paths (separated by ':') - */ -static BOOL elf_load_file_from_path(HANDLE hProcess, - const WCHAR* filename, - unsigned long load_offset, - unsigned long dyn_addr, - const char* path, - struct elf_info* elf_info) -{ - BOOL ret = FALSE; - WCHAR *s, *t, *fn; - WCHAR* pathW = NULL; - unsigned len; - - if (!path) return FALSE; - - len = MultiByteToWideChar(CP_UNIXCP, 0, path, -1, NULL, 0); - pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - if (!pathW) return FALSE; - MultiByteToWideChar(CP_UNIXCP, 0, path, -1, pathW, len); - - for (s = pathW; s && *s; s = (t) ? (t+1) : NULL) - { - t = strchrW(s, ':'); - if (t) *t = '\0'; - fn = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1 + lstrlenW(s) + 1) * sizeof(WCHAR)); - if (!fn) break; - strcpyW(fn, s); - strcatW(fn, S_SlashW); - strcatW(fn, filename); - ret = elf_load_file(hProcess, fn, load_offset, dyn_addr, elf_info); - HeapFree(GetProcessHeap(), 0, fn); - if (ret) break; - } - - HeapFree(GetProcessHeap(), 0, pathW); - return ret; -} - #ifdef AT_SYSINFO_EHDR /****************************************************************** * elf_search_auxv @@ -1418,11 +1377,9 @@ static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename, load_elf.dyn_addr = dyn_addr; load_elf.elf_info = elf_info;
- ret = elf_load_file_from_path(pcs, filename, load_offset, dyn_addr, - getenv("PATH"), elf_info) || - elf_load_file_from_path(pcs, filename, load_offset, dyn_addr, - getenv("LD_LIBRARY_PATH"), elf_info); - if (!ret) ret = search_dll_path(filename, elf_load_file_cb, &load_elf); + ret = search_unix_path(filename, getenv("PATH"), elf_load_file_cb, &load_elf) + || search_unix_path(filename, getenv("LD_LIBRARY_PATH"), elf_load_file_cb, &load_elf) + || search_dll_path(filename, elf_load_file_cb, &load_elf); }
return ret; diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c index 99f6d00395..15e5d344e7 100644 --- a/dlls/dbghelp/path.c +++ b/dlls/dbghelp/path.c @@ -806,3 +806,46 @@ found: heap_free(buf); return TRUE; } + +BOOL search_unix_path(const WCHAR *name, const char *path, BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) +{ + const char *iter, *next; + size_t size, len; + WCHAR *dos_path; + char *buf; + BOOL ret = FALSE; + + if (!path) return FALSE; + name = file_name(name); + + size = WideCharToMultiByte(CP_UNIXCP, 0, name, -1, NULL, 0, NULL, NULL) + strlen(path) + 1; + if (!(buf = heap_alloc(size))) return FALSE; + + for (iter = path;; iter = next + 1) + { + if (!(next = strchr(iter, ':'))) next = iter + strlen(iter); + if (*iter == '/') + { + len = next - iter; + memcpy(buf, iter, len); + if (buf[len - 1] != '/') buf[len++] = '/'; + WideCharToMultiByte(CP_UNIXCP, 0, name, -1, buf + len, size - len, NULL, NULL); + if ((dos_path = wine_get_dos_file_name(buf))) + { + HANDLE file = CreateFileW(dos_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (file != INVALID_HANDLE_VALUE) + { + ret = match(param, file, dos_path); + CloseHandle(file); + if (ret) TRACE("found %s\n", debugstr_w(dos_path)); + } + heap_free(dos_path); + if (ret) break; + } + } + if (*next != ':') break; + } + + heap_free(buf); + return ret; +}