Module: wine Branch: master Commit: 6bcd695c786575d7ba136b3fa7016085977167b0 URL: https://source.winehq.org/git/wine.git/?a=commit;h=6bcd695c786575d7ba136b3fa...
Author: Jacek Caban jacek@codeweavers.com Date: Sat Oct 20 19:19:17 2018 +0200
ntdll: Set IO_STATUS_BLOCK on non-blocking NtFlushBuffersFile success.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/file.c | 21 ++++++++++++++------- dlls/ntdll/tests/file.c | 2 -- dlls/ntdll/tests/pipe.c | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c index 93af301..77d2d32 100644 --- a/dlls/ntdll/file.c +++ b/dlls/ntdll/file.c @@ -3298,13 +3298,15 @@ NTSTATUS WINAPI NtSetEaFile( HANDLE hFile, PIO_STATUS_BLOCK iosb, PVOID buffer, * Success: 0. IoStatusBlock is updated. * Failure: An NTSTATUS error code describing the error. */ -NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock ) +NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK *io ) { NTSTATUS ret; - HANDLE hEvent = NULL; + HANDLE wait_handle; enum server_fd_type type; int fd, needs_close;
+ if (!io || !virtual_check_buffer_for_write( io, sizeof(io) )) return STATUS_ACCESS_VIOLATION; + ret = server_get_unix_fd( hFile, FILE_WRITE_DATA, &fd, &needs_close, &type, NULL ); if (ret == STATUS_ACCESS_DENIED) ret = server_get_unix_fd( hFile, FILE_APPEND_DATA, &fd, &needs_close, &type, NULL ); @@ -3317,16 +3319,21 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock { SERVER_START_REQ( flush ) { - req->async = server_async( hFile, NULL, NULL, NULL, NULL, IoStatusBlock ); + req->async = server_async( hFile, NULL, NULL, NULL, NULL, io ); ret = wine_server_call( req ); - hEvent = wine_server_ptr_handle( reply->event ); + wait_handle = wine_server_ptr_handle( reply->event ); + if (wait_handle && ret != STATUS_PENDING) + { + io->u.Status = ret; + io->Information = 0; + } } SERVER_END_REQ;
- if (hEvent) + if (wait_handle) { - NtWaitForSingleObject( hEvent, FALSE, NULL ); - ret = STATUS_SUCCESS; + NtWaitForSingleObject( wait_handle, FALSE, NULL ); + ret = io->u.Status; } }
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 0f4281d..e523990 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -4501,11 +4501,9 @@ static void test_flush_buffers_file(void) ok(hfileread != INVALID_HANDLE_VALUE, "could not open temp file, error %d.\n", GetLastError());
status = pNtFlushBuffersFile(hfile, NULL); - todo_wine ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#x.\n", status);
status = pNtFlushBuffersFile(hfile, (IO_STATUS_BLOCK *)0xdeadbeaf); - todo_wine ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#x.\n", status);
status = pNtFlushBuffersFile(hfile, &io_status_block); diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c index 798df53..45c8466 100644 --- a/dlls/ntdll/tests/pipe.c +++ b/dlls/ntdll/tests/pipe.c @@ -1378,8 +1378,8 @@ static void test_pipe_state(HANDLE pipe, BOOL is_server, DWORD state) { ok(status == STATUS_SUCCESS, "status = %x in %s state %u\n", status, is_server ? "server" : "client", state); - todo_wine ok(io.Status == status, "io.Status = %x\n", io.Status); + ok(!io.Information, "io.Information = %lx\n", io.Information); }
if (state != FILE_PIPE_CONNECTED_STATE)