Dmitry Timoshkov : ntdll: NtWriteFile should fail for overlapped IO on files if offset is NULL.

Alexandre Julliard julliard at winehq.org
Wed Sep 4 15:08:32 CDT 2013


Module: wine
Branch: master
Commit: d37fac051929cfc82245a1c49e9cbf003bd0119e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d37fac051929cfc82245a1c49e9cbf003bd0119e

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Sep  2 18:29:38 2013 +0900

ntdll: NtWriteFile should fail for overlapped IO on files if offset is NULL.

---

 dlls/ntdll/file.c       |   37 +++++++++++++++++++++++--------------
 dlls/ntdll/tests/file.c |    6 ------
 2 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 3ffc632..3637b69 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -950,26 +950,35 @@ NTSTATUS WINAPI NtWriteFile(HANDLE hFile, HANDLE hEvent,
         goto done;
     }
 
-    if (type == FD_TYPE_FILE && offset && offset->QuadPart != (LONGLONG)-2 /* FILE_USE_FILE_POINTER_POSITION */ )
+    if (type == FD_TYPE_FILE)
     {
-        /* async I/O doesn't make sense on regular files */
-        while ((result = pwrite( unix_handle, buffer, length, offset->QuadPart )) == -1)
+        if (!(options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT)) && !offset)
         {
-            if (errno != EINTR)
+            status = STATUS_INVALID_PARAMETER;
+            goto done;
+        }
+
+        if (offset && offset->QuadPart != (LONGLONG)-2 /* FILE_USE_FILE_POINTER_POSITION */)
+        {
+            /* async I/O doesn't make sense on regular files */
+            while ((result = pwrite( unix_handle, buffer, length, offset->QuadPart )) == -1)
             {
-                if (errno == EFAULT) status = STATUS_INVALID_USER_BUFFER;
-                else status = FILE_GetNtStatus();
-                goto done;
+                if (errno != EINTR)
+                {
+                    if (errno == EFAULT) status = STATUS_INVALID_USER_BUFFER;
+                    else status = FILE_GetNtStatus();
+                    goto done;
+                }
             }
-        }
 
-        if (options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT))
-            /* update file pointer position */
-            lseek( unix_handle, offset->QuadPart + result, SEEK_SET );
+            if (options & (FILE_SYNCHRONOUS_IO_ALERT | FILE_SYNCHRONOUS_IO_NONALERT))
+                /* update file pointer position */
+                lseek( unix_handle, offset->QuadPart + result, SEEK_SET );
 
-        total = result;
-        status = STATUS_SUCCESS;
-        goto done;
+            total = result;
+            status = STATUS_SUCCESS;
+            goto done;
+        }
     }
 
     for (;;)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 1f9d60e..cde299c 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -2109,21 +2109,15 @@ todo_wine
     bytes = 0xdeadbeef;
     SetLastError(0xdeadbeef);
     ret = WriteFile(hfile, contents, sizeof(contents), &bytes, NULL);
-todo_wine
     ok(!ret, "WriteFile should fail\n");
-todo_wine
     ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
-todo_wine
     ok(bytes == 0, "bytes %u\n", bytes);
 
     iob.Status = -1;
     iob.Information = -1;
     status = pNtWriteFile(hfile, 0, NULL, NULL, &iob, contents, sizeof(contents), NULL, NULL);
-todo_wine
     ok(status == STATUS_INVALID_PARAMETER, "expected STATUS_INVALID_PARAMETER, got %#x\n", status);
-todo_wine
     ok(iob.Status == -1, "expected -1, got %#x\n", iob.Status);
-todo_wine
     ok(iob.Information == -1, "expected -1, got %ld\n", iob.Information);
 
     iob.Status = -1;




More information about the wine-cvs mailing list