Jacek Caban : kernel32: Always set bytes read in ReadFile.
Alexandre Julliard
julliard at winehq.org
Tue Jan 23 16:09:50 CST 2018
Module: wine
Branch: master
Commit: d5cd34c7df681fc4ab08a9173d9055dce9f7d6f9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d5cd34c7df681fc4ab08a9173d9055dce9f7d6f9
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Jan 23 15:51:31 2018 +0100
kernel32: Always set bytes read in ReadFile.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 4766830..45b4365 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 922eed9..23e7649 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();
More information about the wine-cvs
mailing list