[2/6] ntdll: NtReadFile should fail for overlapped IO on files if offset is NULL.
Dmitry Timoshkov
dmitry at baikal.ru
Mon Sep 2 04:30:27 CDT 2013
---
dlls/ntdll/file.c | 35 ++++++++++++++++++++++-------------
1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 3637b69..83e286e 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -604,24 +604,33 @@ NTSTATUS WINAPI NtReadFile(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 = pread( 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 = pread( unix_handle, buffer, length, offset->QuadPart )) == -1)
{
- status = FILE_GetNtStatus();
- goto done;
+ if (errno != EINTR)
+ {
+ 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 = total ? STATUS_SUCCESS : STATUS_END_OF_FILE;
- goto done;
+ total = result;
+ status = total ? STATUS_SUCCESS : STATUS_END_OF_FILE;
+ goto done;
+ }
}
for (;;)
--
1.8.3.4
More information about the wine-patches
mailing list