[PATCH 2/3] ntdll: Don't return an error when reading past EOF in NtReadFileScatter

Andrew Eikum aeikum at codeweavers.com
Wed Nov 29 12:52:48 CST 2017


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
 dlls/kernel32/tests/file.c | 27 ++++++++++++++++++++++++++-
 dlls/ntdll/file.c          |  3 ---
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c
index 44fbf7a4b1..e1cf268817 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -4354,7 +4354,7 @@ static void test_WriteFileGather(void)
     OVERLAPPED ovl, *povl = NULL;
     SYSTEM_INFO si;
     BOOL br;
-    char *wbuf = NULL, *rbuf1;
+    char *wbuf = NULL, *rbuf1, *rbuf2;
 
     ret = GetTempPathA( MAX_PATH, temp_path );
     ok( ret != 0, "GetTempPathA error %d\n", GetLastError() );
@@ -4378,6 +4378,9 @@ static void test_WriteFileGather(void)
     rbuf1 = VirtualAlloc( NULL, si.dwPageSize, MEM_COMMIT, PAGE_READWRITE );
     ok( rbuf1 != NULL, "VirtualAlloc failed err %u\n", GetLastError() );
 
+    rbuf2 = VirtualAlloc( NULL, si.dwPageSize, MEM_COMMIT, PAGE_READWRITE );
+    ok( rbuf2 != NULL, "VirtualAlloc failed err %u\n", GetLastError() );
+
     memset( &ovl, 0, sizeof(ovl) );
     memset( fse, 0, sizeof(fse) );
     memset( wbuf, 0x42, si.dwPageSize );
@@ -4405,11 +4408,33 @@ static void test_WriteFileGather(void)
     ok( memcmp( rbuf1, wbuf, si.dwPageSize ) == 0,
             "data was not read into buffer\n" );
 
+    /* read past EOF */
+    memset( &ovl, 0, sizeof(ovl) );
+    memset( fse, 0, sizeof(fse) );
+    fse[0].Buffer = rbuf1;
+    fse[1].Buffer = rbuf2;
+    memset( rbuf1, 0, si.dwPageSize );
+    memset( rbuf2, 0x17, si.dwPageSize );
+    br = ReadFileScatter( hfile, fse, si.dwPageSize * 2, NULL, &ovl );
+    ok( br == FALSE, "ReadFileScatter should be asynchronous\n" );
+    ok( GetLastError() == ERROR_IO_PENDING, "ReadFileScatter failed err %u\n", GetLastError() );
+
+    ret = GetQueuedCompletionStatus( hiocp2, &size, &key, &povl, 1000 );
+    ok( ret, "GetQueuedCompletionStatus failed err %u\n", GetLastError() );
+    ok( povl == &ovl, "wrong ovl %p\n", povl );
+
+    ok( memcmp( rbuf1, wbuf, si.dwPageSize ) == 0,
+            "data was not read into buffer\n" );
+    memset( rbuf1, 0x17, si.dwPageSize );
+    ok( memcmp( rbuf2, rbuf1, si.dwPageSize ) == 0,
+            "data should not have been read into buffer\n" );
+
     CloseHandle( hfile );
     CloseHandle( hiocp1 );
     CloseHandle( hiocp2 );
     VirtualFree( wbuf, 0, MEM_RELEASE );
     VirtualFree( rbuf1, 0, MEM_RELEASE );
+    VirtualFree( rbuf2, 0, MEM_RELEASE );
     DeleteFileA( filename );
 }
 
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index bdfc383d7e..f7db24cc8b 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1071,10 +1071,7 @@ NTSTATUS WINAPI NtReadFileScatter( HANDLE file, HANDLE event, PIO_APC_ROUTINE ap
             break;
         }
         if (!result)
-        {
-            status = STATUS_END_OF_FILE;
             break;
-        }
         total += result;
         length -= result;
         if ((pos += result) == page_size)
-- 
2.15.0





More information about the wine-devel mailing list