From d5cd34c7df681fc4ab08a9173d9055dce9f7d6f9 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 23 Jan 2018 15:51:31 +0100 Subject: [PATCH] kernel32: Always set bytes read in ReadFile. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/file.c | 4 +-- dlls/kernel32/tests/pipe.c | 50 +++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 476683090c0..45b43659e20 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -453,8 +453,8 @@ BOOL WINAPI ReadFile( HANDLE hFile, LPVOID buffer, DWORD bytesToRead, status = io_status->u.Status; } - if (status != STATUS_PENDING && bytesRead) - *bytesRead = io_status->Information; + if (bytesRead) + *bytesRead = overlapped && status ? 0 : io_status->Information; if (status == STATUS_END_OF_FILE) { diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index 922eed9a574..23e764904c5 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -715,6 +715,53 @@ static void test_CreateNamedPipe_instances_must_match(void) ok(CloseHandle(hnp2), "CloseHandle\n"); } +static void test_ReadFile(void) +{ + HANDLE server, client; + OVERLAPPED overlapped; + DWORD size; + BOOL res; + + static char buf[512]; + + server = CreateNamedPipeA(PIPENAME, PIPE_ACCESS_DUPLEX, + PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, + 1, 1024, 1024, NMPWAIT_WAIT_FOREVER, NULL); + ok(server != INVALID_HANDLE_VALUE, "CreateNamedPipe failed with %u\n", GetLastError()); + + client = CreateFileA(PIPENAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, + OPEN_EXISTING, 0, 0); + ok(client != INVALID_HANDLE_VALUE, "CreateFile failed with %u\n", GetLastError()); + + ok(WriteFile(client, buf, sizeof(buf), &size, NULL), "WriteFile\n"); + + res = ReadFile(server, buf, 1, &size, NULL); + ok(!res && GetLastError() == ERROR_MORE_DATA, "ReadFile returned %x(%u)\n", res, GetLastError()); + ok(size == 1, "size = %u\n", size); + + /* pass both overlapped and ret read */ + memset(&overlapped, 0, sizeof(overlapped)); + res = ReadFile(server, buf, 1, &size, &overlapped); + ok(!res && GetLastError() == ERROR_MORE_DATA, "ReadFile returned %x(%u)\n", res, GetLastError()); + ok(size == 0, "size = %u\n", size); + ok((NTSTATUS)overlapped.Internal == STATUS_BUFFER_OVERFLOW, "Internal = %lx\n", overlapped.Internal); + ok(overlapped.InternalHigh == 1, "InternalHigh = %lx\n", overlapped.InternalHigh); + + DisconnectNamedPipe(server); + + memset(&overlapped, 0, sizeof(overlapped)); + overlapped.InternalHigh = 0xdeadbeef; + res = ReadFile(server, buf, 1, &size, &overlapped); + ok(!res && GetLastError() == ERROR_PIPE_NOT_CONNECTED, "ReadFile returned %x(%u)\n", res, GetLastError()); + ok(size == 0, "size = %u\n", size); + ok(overlapped.Internal == STATUS_PENDING, "Internal = %lx\n", overlapped.Internal); + todo_wine + ok(overlapped.InternalHigh == 0xdeadbeef, "InternalHigh = %lx\n", overlapped.InternalHigh); + + CloseHandle(server); + CloseHandle(client); +} + /** implementation of alarm() */ static DWORD CALLBACK alarmThreadMain(LPVOID arg) { @@ -2661,7 +2708,7 @@ static void _overlapped_read_sync(unsigned line, HANDLE reader, void *buf, DWORD else ok_(__FILE__,line)(res, "ReadFile failed: %u\n", GetLastError()); if(partial_read) - todo_wine ok_(__FILE__,line)(!read_bytes, "read_bytes %u expected 0\n", read_bytes); + ok_(__FILE__,line)(!read_bytes, "read_bytes %u expected 0\n", read_bytes); else ok_(__FILE__,line)(read_bytes == expected_result, "read_bytes %u expected %u\n", read_bytes, expected_result); @@ -3122,6 +3169,7 @@ START_TEST(pipe) test_CreateNamedPipe(PIPE_TYPE_BYTE); test_CreateNamedPipe(PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE); test_CreatePipe(); + test_ReadFile(); test_CloseHandle(); test_impersonation(); test_overlapped();