From: Martin Storsjö martin@martin.st
When f7332ab4a6e199d03e4318d82c0b16a0396b935c switched load_so_dll over to a proper Unix syscall, ntdll.so started providing the symbol __wine_unix_call_funcs.
When a DLL calls NtQueryVirtualMemory(MemoryWineUnixFuncs), it can do so speculatively, not knowing whether the corresponding unix lib actually does provide anything.
When ntdll.so started providing this symbol, then such speculative calls to NtQueryVirtualMemory(MemoryWineUnixFuncs) would end up returning ntdll's __wine_unix_call_funcs if the intended DLL's unix library lacked one.
This is the case with bcrypt, where the unix library doesn't provide __wine_unix_call_funcs if gnutls is unavailable.
This fixes crashes after f7332ab4a6e199d03e4318d82c0b16a0396b935c, in builds without gnutls.
Signed-off-by: Martin Storsjö martin@martin.st --- dlls/ntdll/unix/loader.c | 8 ++++---- dlls/ntdll/unix/unix_private.h | 4 ++-- dlls/ntdll/unix/virtual.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index f87e11f073c..37d54e1b170 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -2112,9 +2112,9 @@ static ULONG_PTR get_image_address(void)
/*********************************************************************** - * __wine_unix_call_funcs + * __wine_unix_ntdll_call_funcs */ -const unixlib_entry_t __wine_unix_call_funcs[] = +const unixlib_entry_t __wine_unix_ntdll_call_funcs[] = { load_so_dll, init_builtin_dll, @@ -2128,9 +2128,9 @@ static NTSTATUS wow64_init_builtin_dll( void *args ) { return STATUS_UNSUCCESSFU static NTSTATUS wow64_unwind_builtin_dll( void *args ) { return STATUS_UNSUCCESSFUL; }
/*********************************************************************** - * __wine_unix_call_wow64_funcs + * __wine_unix_ntdll_call_wow64_funcs */ -const unixlib_entry_t __wine_unix_call_wow64_funcs[] = +const unixlib_entry_t __wine_unix_ntdll_call_wow64_funcs[] = { wow64_load_so_dll, wow64_init_builtin_dll, diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index a7fae7ab7ab..b8c63856af5 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -43,8 +43,8 @@ static const WORD current_machine = IMAGE_FILE_MACHINE_ARM64; extern WORD native_machine DECLSPEC_HIDDEN; extern HMODULE ntdll_module DECLSPEC_HIDDEN;
-extern const unixlib_entry_t __wine_unix_call_funcs[]; -extern const unixlib_entry_t __wine_unix_call_wow64_funcs[]; +extern const unixlib_entry_t __wine_unix_ntdll_call_funcs[]; +extern const unixlib_entry_t __wine_unix_ntdll_call_wow64_funcs[];
static const BOOL is_win64 = (sizeof(void *) > sizeof(int));
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 8087a12785c..1cf7c5e59f6 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -647,7 +647,7 @@ static NTSTATUS get_builtin_unix_funcs( void *module, BOOL wow, const void **fun
if (module == ntdll_module) { - *funcs = wow ? __wine_unix_call_wow64_funcs : __wine_unix_call_funcs; + *funcs = wow ? __wine_unix_ntdll_call_wow64_funcs : __wine_unix_ntdll_call_funcs; return STATUS_SUCCESS; }