[KERNEL32]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 30 Jul 2017 08:31:59 +0000 (08:31 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 30 Jul 2017 08:31:59 +0000 (08:31 +0000)
In case of synchronous read, it's legit for the FSD to notify EOF by returning success & zero read length.
It fixes never ending reads when copying a file from NFS to local disk.

CORE-8204
CORE-11327
CORE-13484

svn path=/trunk/; revision=75443

reactos/dll/win32/kernel32/client/file/copy.c

index 9834b5b..92c4555 100644 (file)
@@ -101,6 +101,13 @@ CopyLoop (
                                      RegionSize,
                                      NULL,
                                      NULL);
                                      RegionSize,
                                      NULL,
                                      NULL);
+                /* With sync read, 0 length + status success mean EOF:
+                 * https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
+                 */
+                if (NT_SUCCESS(errCode) && IoStatusBlock.Information == 0)
+                {
+                    errCode = STATUS_END_OF_FILE;
+                }
                 if (NT_SUCCESS(errCode) && (NULL == pbCancel || ! *pbCancel))
                 {
                     errCode = NtWriteFile(FileHandleDest,
                 if (NT_SUCCESS(errCode) && (NULL == pbCancel || ! *pbCancel))
                 {
                     errCode = NtWriteFile(FileHandleDest,