From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/tests/info.c | 6 ++++++ dlls/ntdll/unix/process.c | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/info.c b/dlls/ntdll/tests/info.c index 49a57441649..9224af56e05 100644 --- a/dlls/ntdll/tests/info.c +++ b/dlls/ntdll/tests/info.c @@ -2368,8 +2368,11 @@ static void test_query_process_image_file_name(void) ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
buffer = malloc(ReturnLength); + memset( buffer, 0xcc, ReturnLength ); status = NtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileName, buffer, ReturnLength, &ReturnLength); ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status); + ok( buffer->MaximumLength == buffer->Length + sizeof(WCHAR), "got %u, %u.\n", buffer->Length, buffer->MaximumLength ); + ok ( !buffer->Buffer[buffer->Length / sizeof(WCHAR)], "got %#x.\n", buffer->Buffer[buffer->Length / sizeof(WCHAR)] ); todo_wine ok(!memcmp(buffer->Buffer, deviceW, sizeof(deviceW)), "Expected image name to begin with \Device\, got %s\n", @@ -2391,8 +2394,11 @@ static void test_query_process_image_file_name(void) ok( status == STATUS_INFO_LENGTH_MISMATCH, "Expected STATUS_INFO_LENGTH_MISMATCH, got %08lx\n", status);
buffer = malloc(ReturnLength); + memset( buffer, 0xcc, ReturnLength ); status = NtQueryInformationProcess( GetCurrentProcess(), ProcessImageFileNameWin32, buffer, ReturnLength, &ReturnLength); ok( status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08lx\n", status); + ok( buffer->MaximumLength == buffer->Length + sizeof(WCHAR), "got %u, %u.\n", buffer->Length, buffer->MaximumLength ); + ok ( !buffer->Buffer[buffer->Length / sizeof(WCHAR)], "got %#x.\n", buffer->Buffer[buffer->Length / sizeof(WCHAR)] ); ok(memcmp(buffer->Buffer, deviceW, sizeof(deviceW)), "Expected image name not to begin with \Device\, got %s\n", wine_dbgstr_wn(buffer->Buffer, buffer->Length / sizeof(WCHAR))); diff --git a/dlls/ntdll/unix/process.c b/dlls/ntdll/unix/process.c index c3a730379a4..0c8b4bb9c67 100644 --- a/dlls/ntdll/unix/process.c +++ b/dlls/ntdll/unix/process.c @@ -1456,19 +1456,22 @@ NTSTATUS WINAPI NtQueryInformationProcess( HANDLE handle, PROCESSINFOCLASS class case ProcessImageFileNameWin32: SERVER_START_REQ( get_process_image_name ) { + const unsigned int min_size = sizeof(UNICODE_STRING) + sizeof(WCHAR); UNICODE_STRING *str = info;
req->handle = wine_server_obj_handle( handle ); req->win32 = (class == ProcessImageFileNameWin32); wine_server_set_reply( req, str ? str + 1 : NULL, - size > sizeof(UNICODE_STRING) ? size - sizeof(UNICODE_STRING) : 0 ); + size > min_size ? size - min_size : 0 ); ret = wine_server_call( req ); if (ret == STATUS_BUFFER_TOO_SMALL) ret = STATUS_INFO_LENGTH_MISMATCH; - len = sizeof(UNICODE_STRING) + reply->len; + len = min_size + reply->len; if (ret == STATUS_SUCCESS) { - str->MaximumLength = str->Length = reply->len; + str->Length = reply->len; + str->MaximumLength = str->Length + sizeof(WCHAR); str->Buffer = (PWSTR)(str + 1); + str->Buffer[str->Length / sizeof(WCHAR)] = 0; } } SERVER_END_REQ;