Zebediah Figura : server: Always wake up pending read or write asyncs on POLLHUP or POLLERR.
Alexandre Julliard
julliard at winehq.org
Wed Jul 20 15:55:32 CDT 2022
Module: wine
Branch: master
Commit: f234341ca1170a799d03179061914b772d4166cd
URL: https://gitlab.winehq.org/wine/wine/-/commit/f234341ca1170a799d03179061914b772d4166cd
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Thu Apr 28 21:40:46 2022 -0500
server: Always wake up pending read or write asyncs on POLLHUP or POLLERR.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52815
---
dlls/ws2_32/tests/sock.c | 32 ++++++++++++++++----------------
server/sock.c | 6 ++----
2 files changed, 18 insertions(+), 20 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 490b3b96e51..b0f07b9ab58 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7018,12 +7018,12 @@ static void test_WSARecv(void)
close_with_rst(src);
dwret = WaitForSingleObject(ov.hEvent, 1000);
- todo_wine ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %ld + errno %ld\n", dwret, GetLastError());
+ ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %ld + errno %ld\n", dwret, GetLastError());
bret = GetOverlappedResult((HANDLE)dest, &ov, &bytesReturned, FALSE);
ok(!bret, "expected failure\n");
- todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
- todo_wine ok(bytesReturned == 0, "Bytes received is %ld\n", bytesReturned);
+ ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
+ ok(bytesReturned == 0, "Bytes received is %ld\n", bytesReturned);
closesocket(dest);
dest = INVALID_SOCKET;
@@ -9669,10 +9669,10 @@ static void test_completion_port(void)
bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
- todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %ld\n", GetLastError());
- todo_wine ok(key == 125, "Key is %Iu\n", key);
- todo_wine ok(num_bytes == 0, "Number of bytes received is %lu\n", num_bytes);
- todo_wine ok(olp == &ov, "Overlapped structure is at %p\n", olp);
+ ok(GetLastError() == ERROR_NETNAME_DELETED, "Last error was %ld\n", GetLastError());
+ ok(key == 125, "Key is %Iu\n", key);
+ ok(num_bytes == 0, "Number of bytes received is %lu\n", num_bytes);
+ ok(olp == &ov, "Overlapped structure is at %p\n", olp);
SetLastError(0xdeadbeef);
key = 0xdeadbeef;
@@ -9721,10 +9721,10 @@ static void test_completion_port(void)
bret = GetQueuedCompletionStatus( io_port, &num_bytes, &key, &olp, 200 );
ok(bret == FALSE, "GetQueuedCompletionStatus returned %u\n", bret );
- todo_wine ok(GetLastError() == WAIT_TIMEOUT, "Last error was %ld\n", GetLastError());
- todo_wine ok(key == 0xdeadbeef, "Key is %Iu\n", key);
- todo_wine ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes);
- todo_wine ok(!olp, "Overlapped structure is at %p\n", olp);
+ ok(GetLastError() == WAIT_TIMEOUT, "Last error was %ld\n", GetLastError());
+ ok(key == 0xdeadbeef, "Key is %Iu\n", key);
+ ok(num_bytes == 0xdeadbeef, "Number of bytes transferred is %lu\n", num_bytes);
+ ok(!olp, "Overlapped structure is at %p\n", olp);
if (dest != INVALID_SOCKET)
closesocket(dest);
@@ -12851,12 +12851,12 @@ static void test_tcp_reset(void)
close_with_rst(server);
ret = WaitForSingleObject(overlapped.hEvent, 1000);
- todo_wine ok(!ret, "wait failed\n");
+ ok(!ret, "wait failed\n");
ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, FALSE);
ok(!ret, "expected failure\n");
- todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
- todo_wine ok(!size, "got size %lu\n", size);
- todo_wine ok((NTSTATUS)overlapped.Internal == STATUS_CONNECTION_RESET, "got status %#lx\n", (NTSTATUS)overlapped.Internal);
+ ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
+ ok(!size, "got size %lu\n", size);
+ ok((NTSTATUS)overlapped.Internal == STATUS_CONNECTION_RESET, "got status %#lx\n", (NTSTATUS)overlapped.Internal);
len = sizeof(error);
ret = getsockopt(client, SOL_SOCKET, SO_ERROR, (char *)&error, &len);
@@ -12868,7 +12868,7 @@ static void test_tcp_reset(void)
WSASetLastError(0xdeadbeef);
size = 0xdeadbeef;
ret = WSARecv(client, &wsabuf, 1, &size, &flags, &overlapped, NULL);
- ok(ret == -1, "got %d\n", ret);
+ todo_wine ok(ret == -1, "got %d\n", ret);
todo_wine ok(WSAGetLastError() == WSAECONNRESET, "got error %u\n", WSAGetLastError());
check_poll_todo(client, POLLERR | POLLHUP | POLLWRNORM);
diff --git a/server/sock.c b/server/sock.c
index 31a04579fce..95335df8fd3 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -1046,10 +1046,8 @@ static int sock_dispatch_asyncs( struct sock *sock, int event, int error )
int status = sock_get_ntstatus( error );
struct accept_req *req, *next;
- if (sock->rd_shutdown || sock->hangup)
- async_wake_up( &sock->read_q, status );
- if (sock->wr_shutdown)
- async_wake_up( &sock->write_q, status );
+ async_wake_up( &sock->read_q, status );
+ async_wake_up( &sock->write_q, status );
LIST_FOR_EACH_ENTRY_SAFE( req, next, &sock->accept_list, struct accept_req, entry )
{
More information about the wine-cvs
mailing list