Alexandre Julliard : ntdll: Allow the module file name to not be null-terminated.
Module: wine Branch: master Commit: 19c48204bb0aa3dadde1247a66b69d9cd51b7e03 URL: https://source.winehq.org/git/wine.git/?a=commit;h=19c48204bb0aa3dadde1247a6... Author: Alexandre Julliard <julliard(a)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(a)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 ))
participants (1)
-
Alexandre Julliard