Module: wine Branch: master Commit: 19c48204bb0aa3dadde1247a66b69d9cd51b7e03 URL: https://source.winehq.org/git/wine.git/?a=commit;h=19c48204bb0aa3dadde1247a6...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Apr 14 21:58:23 2020 +0200
ntdll: Allow the module file name to not be null-terminated.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/loader.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 2be0cde537..524eab7460 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1174,6 +1174,7 @@ static NTSTATUS fixup_imports( WINE_MODREF *wm, LPCWSTR load_path ) */ static WINE_MODREF *alloc_module( HMODULE hModule, const UNICODE_STRING *nt_name, BOOL builtin ) { + WCHAR *buffer; WINE_MODREF *wm; const WCHAR *p; const IMAGE_NT_HEADERS *nt = RtlImageNtHeader(hModule); @@ -1186,9 +1187,16 @@ static WINE_MODREF *alloc_module( HMODULE hModule, const UNICODE_STRING *nt_name wm->ldr.TlsIndex = -1; wm->ldr.LoadCount = 1;
- RtlCreateUnicodeString( &wm->ldr.FullDllName, nt_name->Buffer + 4 /* ??\ prefix */ ); - if ((p = wcsrchr( wm->ldr.FullDllName.Buffer, '\' ))) p++; - else p = wm->ldr.FullDllName.Buffer; + if (!(buffer = RtlAllocateHeap( GetProcessHeap(), 0, nt_name->Length - 3 * sizeof(WCHAR) ))) + { + RtlFreeHeap( GetProcessHeap(), 0, wm ); + return NULL; + } + memcpy( buffer, nt_name->Buffer + 4 /* ??\ prefix */, nt_name->Length - 4 * sizeof(WCHAR) ); + buffer[nt_name->Length/sizeof(WCHAR) - 4] = 0; + if ((p = wcsrchr( buffer, '\' ))) p++; + else p = buffer; + RtlInitUnicodeString( &wm->ldr.FullDllName, buffer ); RtlInitUnicodeString( &wm->ldr.BaseDllName, p );
if (!is_dll_native_subsystem( &wm->ldr, nt, p ))