[PATCH 3/5] server: Explicitly forbid connecting a listening or connected socket.

Zebediah Figura zfigura at codeweavers.com
Tue Jul 6 23:48:43 CDT 2021


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51381
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/ws2_32/tests/sock.c | 10 +++++-----
 server/sock.c            | 23 ++++++++++++++++++-----
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 3e0ac405447..97b772e12d9 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -6626,14 +6626,14 @@ static void test_connect(void)
     WSASetLastError(0xdeadbeef);
     iret = connect(listener, (struct sockaddr *)&address, sizeof(address));
     ok(iret == -1, "got %d\n", iret);
-    todo_wine ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
+    ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     overlapped.Internal = 0xdeadbeef;
     overlapped.InternalHigh = 0xdeadbeef;
     iret = pConnectEx(listener, (struct sockaddr *)&address, sizeof(address), NULL, 0, &bytesReturned, &overlapped);
     ok(!iret, "got %d\n", iret);
-    todo_wine ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
+    ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
     ok(overlapped.Internal == STATUS_PENDING, "got status %#x\n", (NTSTATUS)overlapped.Internal);
     todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "got size %Iu\n", overlapped.InternalHigh);
 
@@ -6706,7 +6706,7 @@ static void test_connect(void)
 
     WSASetLastError(0xdeadbeef);
     iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
-    todo_wine ok(iret == -1, "got %d\n", iret);
+    ok(iret == -1, "got %d\n", iret);
     todo_wine ok(WSAGetLastError() == WSAEINVAL, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
@@ -6740,8 +6740,8 @@ static void test_connect(void)
 
     WSASetLastError(0xdeadbeef);
     iret = connect(connector, (struct sockaddr *)&address, sizeof(address));
-    todo_wine ok(iret == -1, "got %d\n", iret);
-    todo_wine ok(WSAGetLastError() == WSAEISCONN, "got error %u\n", WSAGetLastError());
+    ok(iret == -1, "got %d\n", iret);
+    ok(WSAGetLastError() == WSAEISCONN, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     iret = connect(acceptor, (struct sockaddr *)&address, sizeof(address));
diff --git a/server/sock.c b/server/sock.c
index 5fdbf0bd9ba..3f0526016f9 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -2164,12 +2164,25 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
             return 0;
         }
 
-        if (sock->state == SOCK_CONNECTING)
+        switch (sock->state)
         {
-            /* FIXME: STATUS_ADDRESS_ALREADY_ASSOCIATED probably isn't right,
-             * but there's no status code that maps to WSAEALREADY... */
-            set_error( params->synchronous ? STATUS_ADDRESS_ALREADY_ASSOCIATED : STATUS_INVALID_PARAMETER );
-            return 0;
+            case SOCK_LISTENING:
+                set_error( STATUS_INVALID_PARAMETER );
+                return 0;
+
+            case SOCK_CONNECTING:
+                /* FIXME: STATUS_ADDRESS_ALREADY_ASSOCIATED probably isn't right,
+                 * but there's no status code that maps to WSAEALREADY... */
+                set_error( params->synchronous ? STATUS_ADDRESS_ALREADY_ASSOCIATED : STATUS_INVALID_PARAMETER );
+                return 0;
+
+            case SOCK_CONNECTED:
+                set_error( STATUS_CONNECTION_ACTIVE );
+                return 0;
+
+            case SOCK_UNCONNECTED:
+            case SOCK_CONNECTIONLESS:
+                break;
         }
 
         unix_len = sockaddr_to_unix( addr, params->addr_len, &unix_addr );
-- 
2.30.2




More information about the wine-devel mailing list