Zebediah Figura : Revert "server: Explicitly shutdown destroyed sockets to force pending poll() calls to return.".

Alexandre Julliard julliard at winehq.org
Wed Jul 20 15:55:32 CDT 2022


Module: wine
Branch: master
Commit: 07b66768b101c3bf8152c5db09c2bfa432e0eba6
URL:    https://gitlab.winehq.org/wine/wine/-/commit/07b66768b101c3bf8152c5db09c2bfa432e0eba6

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Thu Apr 28 21:11:02 2022 -0500

Revert "server: Explicitly shutdown destroyed sockets to force pending poll() calls to return.".

This reverts commit 24b64534e592e47e5cac70e497a98c0ddbc3941b.

We no longer perform any blocking waits on the client side, so shutdown() is no
longer necessary.

Moreover, shutting down is not always correct. Under some conditions, closing a
TCP socket should trigger RST without FIN (namely, when SO_LINGER is on but has
a zero timeout). By reverting this commit we match Windows behaviour in this
respect.

---

 dlls/ws2_32/tests/afd.c  |  9 ++++-----
 dlls/ws2_32/tests/sock.c | 30 +++++++++++++++---------------
 server/sock.c            |  7 +------
 3 files changed, 20 insertions(+), 26 deletions(-)

diff --git a/dlls/ws2_32/tests/afd.c b/dlls/ws2_32/tests/afd.c
index f2dccd465a3..9852d54ecb9 100644
--- a/dlls/ws2_32/tests/afd.c
+++ b/dlls/ws2_32/tests/afd.c
@@ -162,8 +162,7 @@ static void check_poll_(int line, SOCKET s, HANDLE event, int mask, int expect,
     ok_(__FILE__, line)(out_params.count == 1, "got count %u\n", out_params.count);
     ok_(__FILE__, line)(out_params.sockets[0].socket == s, "got socket %#Ix\n", out_params.sockets[0].socket);
     todo_wine_if (todo) ok_(__FILE__, line)(out_params.sockets[0].flags == expect, "got flags %#x\n", out_params.sockets[0].flags);
-    todo_wine_if (expect & AFD_POLL_RESET)
-        ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status);
+    ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status);
 }
 
 static void test_poll(void)
@@ -1408,7 +1407,7 @@ static void test_poll_reset(void)
     ok(out_params->count == 1, "got count %u\n", out_params->count);
     ok(out_params->sockets[0].socket == client, "got socket %#Ix\n", out_params->sockets[0].socket);
     todo_wine ok(out_params->sockets[0].flags == AFD_POLL_RESET, "got flags %#x\n", out_params->sockets[0].flags);
-    ok(!out_params->sockets[0].status, "got status %#x\n", out_params->sockets[0].status);
+    todo_wine ok(!out_params->sockets[0].status, "got status %#x\n", out_params->sockets[0].status);
 
     check_poll_todo(client, event, AFD_POLL_WRITE | AFD_POLL_CONNECT | AFD_POLL_RESET);
 
@@ -2044,7 +2043,7 @@ static void test_get_events_reset(void)
     ok(!ret, "got %#x\n", ret);
     todo_wine ok(params.flags == (AFD_POLL_RESET | AFD_POLL_CONNECT | AFD_POLL_WRITE), "got flags %#x\n", params.flags);
     for (i = 0; i < ARRAY_SIZE(params.status); ++i)
-        ok(!params.status[i], "got status[%u] %#x\n", i, params.status[i]);
+        todo_wine_if (i == AFD_POLL_BIT_HUP) ok(!params.status[i], "got status[%u] %#x\n", i, params.status[i]);
 
     closesocket(client);
 
@@ -2062,7 +2061,7 @@ static void test_get_events_reset(void)
     ok(!ret, "got %#x\n", ret);
     todo_wine ok(params.flags == (AFD_POLL_RESET | AFD_POLL_WRITE), "got flags %#x\n", params.flags);
     for (i = 0; i < ARRAY_SIZE(params.status); ++i)
-        ok(!params.status[i], "got status[%u] %#x\n", i, params.status[i]);
+        todo_wine_if (i == AFD_POLL_BIT_HUP) ok(!params.status[i], "got status[%u] %#x\n", i, params.status[i]);
 
     closesocket(server);
 
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index c89f48879aa..490b3b96e51 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);
-    ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %ld + errno %ld\n", dwret, GetLastError());
+    todo_wine ok(dwret == WAIT_OBJECT_0, "Waiting for disconnect event failed with %ld + errno %ld\n", dwret, GetLastError());
 
     bret = GetOverlappedResult((HANDLE)dest, &ov, &bytesReturned, FALSE);
-    todo_wine ok(!bret, "expected failure\n");
+    ok(!bret, "expected failure\n");
     todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
-    ok(bytesReturned == 0, "Bytes received is %ld\n", bytesReturned);
+    todo_wine ok(bytesReturned == 0, "Bytes received is %ld\n", bytesReturned);
     closesocket(dest);
     dest = INVALID_SOCKET;
 
@@ -9668,11 +9668,11 @@ static void test_completion_port(void)
     olp = (WSAOVERLAPPED *)0xdeadbeef;
 
     bret = GetQueuedCompletionStatus(io_port, &num_bytes, &key, &olp, 100);
-    todo_wine ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
+    ok(bret == FALSE, "GetQueuedCompletionStatus returned %d\n", bret);
     todo_wine 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);
+    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);
 
     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 );
-    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);
+    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);
 
     if (dest != INVALID_SOCKET)
         closesocket(dest);
@@ -12851,11 +12851,11 @@ static void test_tcp_reset(void)
     close_with_rst(server);
 
     ret = WaitForSingleObject(overlapped.hEvent, 1000);
-    ok(!ret, "wait failed\n");
+    todo_wine ok(!ret, "wait failed\n");
     ret = GetOverlappedResult((HANDLE)client, &overlapped, &size, FALSE);
-    todo_wine ok(!ret, "expected failure\n");
+    ok(!ret, "expected failure\n");
     todo_wine ok(GetLastError() == ERROR_NETNAME_DELETED, "got error %lu\n", GetLastError());
-    ok(!size, "got size %lu\n", size);
+    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);
 
     len = sizeof(error);
@@ -12868,7 +12868,7 @@ static void test_tcp_reset(void)
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
     ret = WSARecv(client, &wsabuf, 1, &size, &flags, &overlapped, NULL);
-    todo_wine ok(ret == -1, "got %d\n", ret);
+    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 4eef5c1ddb7..31a04579fce 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -1467,12 +1467,7 @@ static void sock_destroy( struct object *obj )
     free_async_queue( &sock->connect_q );
     free_async_queue( &sock->poll_q );
     if (sock->event) release_object( sock->event );
-    if (sock->fd)
-    {
-        /* shut the socket down to force pending poll() calls in the client to return */
-        shutdown( get_unix_fd(sock->fd), SHUT_RDWR );
-        release_object( sock->fd );
-    }
+    if (sock->fd) release_object( sock->fd );
 }
 
 static struct sock *create_socket(void)




More information about the wine-cvs mailing list