[PATCH v4 7/8] ntdll: Don't call try_send before server call in sock_send.
Jinoh Kang
jinoh.kang.kr at gmail.com
Thu Mar 3 07:30:45 CST 2022
Otherwise, try_send() call from sock_send() may race against try_send()
call from async_send_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>
---
Notes:
v1 -> v2: no changes
v2 -> v3: no changes
v3 -> v4: no changes
dlls/ntdll/unix/socket.c | 13 ++-----------
dlls/ws2_32/tests/sock.c | 14 +++++++-------
2 files changed, 9 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c
index 23014ceceaf..ad03907523d 100644
--- a/dlls/ntdll/unix/socket.c
+++ b/dlls/ntdll/unix/socket.c
@@ -921,22 +921,13 @@ static NTSTATUS sock_send( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi
data_size += len;
}
- status = try_send( fd, async );
-
- if (status != STATUS_SUCCESS && 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;
SERVER_START_REQ( send_socket )
{
req->data_size = data_size;
req->status = status;
- req->total = async->sent_len;
+ req->total = 0;
req->async = server_async( handle, &async->io, event, apc, apc_user, iosb_client_ptr(io) );
status = wine_server_call( req );
wait_handle = wine_server_ptr_handle( reply->wait );
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 6b6267dc153..caf76868f89 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7799,7 +7799,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = send(client, "test", 5, 0);
ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
ret = recv(server, buffer, sizeof(buffer), 0);
ok(!ret, "got %d\n", ret);
@@ -7846,7 +7846,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = send(server, "test", 5, 0);
ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
addrlen = sizeof(addr);
ret = getpeername(client, (struct sockaddr *)&addr, &addrlen);
@@ -7896,7 +7896,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = send(client, "test", 5, 0);
ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
ret = recv(server, buffer, sizeof(buffer), 0);
ok(!ret, "got %d\n", ret);
@@ -7914,7 +7914,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = send(server, "test", 5, 0);
ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
addrlen = sizeof(addr);
ret = getpeername(client, (struct sockaddr *)&addr, &addrlen);
@@ -8045,7 +8045,7 @@ static void test_shutdown(void)
WSASetLastError(0xdeadbeef);
ret = sendto(client, "test", 5, 0, (struct sockaddr *)&server_addr, sizeof(server_addr));
ok(ret == -1, "got %d\n", ret);
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
closesocket(client);
closesocket(server);
@@ -8126,7 +8126,7 @@ static void test_DisconnectEx(void)
WSASetLastError(0xdeadbeef);
ret = send(client, "test", 5, 0);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
ret = recv(server, buffer, sizeof(buffer), 0);
ok(!ret, "got %d\n", ret);
@@ -8180,7 +8180,7 @@ static void test_DisconnectEx(void)
WSASetLastError(0xdeadbeef);
ret = send(client, "test", 5, 0);
ok(ret == -1, "expected failure\n");
- todo_wine ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
+ ok(WSAGetLastError() == WSAESHUTDOWN, "got error %u\n", WSAGetLastError());
ret = recv(server, buffer, sizeof(buffer), 0);
ok(!ret, "got %d\n", ret);
--
2.34.1
More information about the wine-devel
mailing list