From: Trent Waddington <trent.waddington@tensorworks.com.au> --- dlls/kernel32/tests/loader.c | 24 ++++++++---------------- dlls/kernelbase/loader.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 64e8c446a90..8547e79bf26 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -1572,10 +1572,8 @@ static void test_getmodulefilenamew_string_termination(void) ok(err == ERROR_INSUFFICIENT_BUFFER, "didn't get expected error getting path for NULL module with short buffer: %d\n", (int)err); dll_name_term = wcsnlen(dll_name, MAX_PATH); ok(dll_name_term > 0, "can't get path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); - todo_wine { - ok(dll_name_term < MAX_PATH, "unterminated path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); - ok(dll_name_term == dll_name_len - 1, "incorrect path termination for NULL module with short buffer. Expected %d got %d. rv=%d\n", dll_name_len - 1, dll_name_term, (int)rv); - } + ok(dll_name_term < MAX_PATH, "unterminated path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); + ok(dll_name_term == dll_name_len - 1, "incorrect path termination for NULL module with short buffer. Expected %d got %d. rv=%d\n", dll_name_len - 1, dll_name_term, (int)rv); mod = LoadLibraryW( L"user32.dll" ); ok(mod != NULL, "can't load test dll\n"); @@ -1592,10 +1590,8 @@ static void test_getmodulefilenamew_string_termination(void) ok(err == ERROR_INSUFFICIENT_BUFFER, "didn't get expected error getting path for test module with short buffer: %d\n", (int)err); dll_name_term = wcsnlen(dll_name, MAX_PATH); ok(dll_name_term > 0, "can't get path for test module with short buffer, dll_name_term=%d\n", dll_name_term); - todo_wine { - ok(dll_name_term < MAX_PATH, "unterminated path for test module with short buffer, dll_name_term=%d\n", dll_name_term); - ok(dll_name_term == dll_name_len - 1, "incorrect path termination for test module with short buffer. Expected %d got %d\n", dll_name_len - 1, dll_name_term); - } + ok(dll_name_term < MAX_PATH, "unterminated path for test module with short buffer, dll_name_term=%d\n", dll_name_term); + ok(dll_name_term == dll_name_len - 1, "incorrect path termination for test module with short buffer. Expected %d got %d\n", dll_name_len - 1, dll_name_term); FreeLibrary( mod ); } @@ -1620,10 +1616,8 @@ static void test_getmodulefilenamea_string_termination(void) ok(err == ERROR_INSUFFICIENT_BUFFER, "didn't get expected error getting path for NULL module with short buffer: %d\n", (int)err); dll_name_term = strnlen(dll_name, MAX_PATH); ok(dll_name_term > 0, "can't get path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); - todo_wine { - ok(dll_name_term < MAX_PATH, "unterminated path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); - ok(dll_name_term == dll_name_len - 1, "incorrect path termination for NULL module with short buffer. Expected %d got %d. rv=%d\n", dll_name_len - 1, dll_name_term, (int)rv); - } + ok(dll_name_term < MAX_PATH, "unterminated path for NULL module with short buffer, dll_name_term=%d\n", dll_name_term); + ok(dll_name_term == dll_name_len - 1, "incorrect path termination for NULL module with short buffer. Expected %d got %d. rv=%d\n", dll_name_len - 1, dll_name_term, (int)rv); mod = LoadLibraryA( "user32.dll" ); ok(mod != NULL, "can't load test dll\n"); @@ -1640,10 +1634,8 @@ static void test_getmodulefilenamea_string_termination(void) ok(err == ERROR_INSUFFICIENT_BUFFER, "didn't get expected error getting path for test module with short buffer: %d\n", (int)err); dll_name_term = strnlen(dll_name, MAX_PATH); ok(dll_name_term > 0, "can't get path for test module with short buffer, dll_name_term=%d\n", dll_name_term); - todo_wine { - ok(dll_name_term < MAX_PATH, "unterminated path for test module with short buffer, dll_name_term=%d\n", dll_name_term); - ok(dll_name_term == dll_name_len - 1, "incorrect path termination for test module with short buffer. Expected %d got %d\n", dll_name_len - 1, dll_name_term); - } + ok(dll_name_term < MAX_PATH, "unterminated path for test module with short buffer, dll_name_term=%d\n", dll_name_term); + ok(dll_name_term == dll_name_len - 1, "incorrect path termination for test module with short buffer. Expected %d got %d\n", dll_name_len - 1, dll_name_term); FreeLibrary( mod ); } diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c index f4e1ca2e23a..e26a08ccca5 100644 --- a/dlls/kernelbase/loader.c +++ b/dlls/kernelbase/loader.c @@ -302,13 +302,12 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetModuleFileNameW( HMODULE module, LPWSTR filena ULONG len = 0; WIN16_SUBSYSTEM_TIB *win16_tib; UNICODE_STRING name; - NTSTATUS status; + NTSTATUS status = 0; if (!module && ((win16_tib = NtCurrentTeb()->Tib.SubSystemTib)) && win16_tib->exe_name) { len = min( size, win16_tib->exe_name->Length / sizeof(WCHAR) ); memcpy( filename, win16_tib->exe_name->Buffer, len * sizeof(WCHAR) ); - if (len < size) filename[len] = 0; goto done; } @@ -319,6 +318,13 @@ DWORD WINAPI DECLSPEC_HOTPATCH GetModuleFileNameW( HMODULE module, LPWSTR filena SetLastError( RtlNtStatusToDosError( status )); done: TRACE( "%s\n", debugstr_wn(filename, len) ); + if (!status || status == STATUS_BUFFER_TOO_SMALL) + { + if (len < size) + filename[len] = 0; + else if (size > 0) + filename[size - 1] = 0; + } return len; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10291