mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 694432 - Make the LdrLoadDll hook compatible with Windows 8 by not assuming that a valid path would always be passed; r=bsmedberg
--HG-- extra : rebase_source : e0df4ea7724118968276d55a0ec25fe4111756d4
This commit is contained in:
parent
d5111d16d8
commit
082fd77472
@ -210,11 +210,17 @@ patched_LdrLoadDll (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileNam
|
|||||||
wchar_t *dll_part;
|
wchar_t *dll_part;
|
||||||
DllBlockInfo *info;
|
DllBlockInfo *info;
|
||||||
|
|
||||||
|
// In Windows 8, the first parameter seems to be used for more than just the
|
||||||
|
// path name. For example, its numerical value can be 1. Passing a non-valid
|
||||||
|
// pointer to SearchPathW will cause a crash, so we need to check to see if we
|
||||||
|
// are handed a valid pointer, and otherwise just pass NULL to SearchPathW.
|
||||||
|
PWCHAR sanitizedFilePath = (intptr_t(filePath) < 1024) ? NULL : filePath;
|
||||||
|
|
||||||
int len = moduleFileName->Length / 2;
|
int len = moduleFileName->Length / 2;
|
||||||
wchar_t *fname = moduleFileName->Buffer;
|
wchar_t *fname = moduleFileName->Buffer;
|
||||||
|
|
||||||
// figure out the length of the string that we need
|
// figure out the length of the string that we need
|
||||||
DWORD pathlen = SearchPathW(filePath, fname, L".dll", 0, NULL, NULL);
|
DWORD pathlen = SearchPathW(sanitizedFilePath, fname, L".dll", 0, NULL, NULL);
|
||||||
if (pathlen == 0) {
|
if (pathlen == 0) {
|
||||||
// uh, we couldn't find the DLL at all, so...
|
// uh, we couldn't find the DLL at all, so...
|
||||||
printf_stderr("LdrLoadDll: Blocking load of '%s' (SearchPathW didn't find it?)\n", dllName);
|
printf_stderr("LdrLoadDll: Blocking load of '%s' (SearchPathW didn't find it?)\n", dllName);
|
||||||
@ -228,7 +234,7 @@ patched_LdrLoadDll (PWCHAR filePath, PULONG flags, PUNICODE_STRING moduleFileNam
|
|||||||
}
|
}
|
||||||
|
|
||||||
// now actually grab it
|
// now actually grab it
|
||||||
SearchPathW(filePath, fname, L".dll", pathlen+1, full_fname, NULL);
|
SearchPathW(sanitizedFilePath, fname, L".dll", pathlen+1, full_fname, NULL);
|
||||||
|
|
||||||
// The filename isn't guaranteed to be null terminated, but in practice
|
// The filename isn't guaranteed to be null terminated, but in practice
|
||||||
// it always will be; ensure that this is so, and bail if not.
|
// it always will be; ensure that this is so, and bail if not.
|
||||||
|
Loading…
Reference in New Issue
Block a user