[RFC PATCH 4/5] ntdll: Don't call try_recv before server call in sock_recv.
Jinoh Kang
jinoh.kang.kr at gmail.com
Thu Jan 27 12:41:39 CST 2022
Otherwise, try_recv() call from sock_recv() may race against try_recv()
call from async_recv_proc(), shuffling the packet order.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52401
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
---
dlls/ntdll/unix/socket.c | 12 ++----------
dlls/ws2_32/tests/sock.c | 8 ++++----
2 files changed, 6 insertions(+), 14 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 336f655e19e..a46e84616ec 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -737,16 +737,8 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi
}
}
- status = try_recv( fd, async, &information );
-
- if (status != STATUS_SUCCESS && status != STATUS_BUFFER_OVERFLOW && status != STATUS_DEVICE_NOT_READY)
- {
- release_fileio( &async->io );
- return status;
- }
-
- if (status == STATUS_DEVICE_NOT_READY && force_async)
- status = STATUS_PENDING;
+ status = force_async ? STATUS_PENDING : STATUS_DEVICE_NOT_READY;
+ information = 0;
SERVER_START_REQ( recv_socket )
{
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 054e597b719..4199676f460 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7750,8 +7750,8 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = recv(server, buffer, sizeof(buffer), 0);
- todo_wine ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(ret == -1, "got %d\n", ret);
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
ret = send(server, "test", 5, 0);
ok(ret == 5, "got %d\n", ret);
@@ -7845,8 +7845,8 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = recv(server, buffer, sizeof(buffer), 0);
- todo_wine ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(ret == -1, "got %d\n", ret);
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
WSASetLastError(0xdeadbeef);
ret = send(server, "test", 5, 0);
--
2.34.1
More information about the wine-devel
mailing list