[PATCH 4/6] ws2_32: Always return WSAEFAULT from WSAIoctl() if ret_size is NULL.

Zebediah Figura z.figura12 at gmail.com
Mon May 31 22:16:35 CDT 2021


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/ws2_32/socket.c     | 18 +++++------
 dlls/ws2_32/tests/sock.c | 66 +++++++++++++++++++---------------------
 2 files changed, 41 insertions(+), 43 deletions(-)

diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 24ac24dcdeb..b6a14c3e4f4 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3329,7 +3329,7 @@ static DWORD get_interface_list(SOCKET s, void *out_buff, DWORD out_size, DWORD
     DWORD status = 0;
     int fd;
 
-    if (!out_buff || !ret_size)
+    if (!out_buff)
         return WSAEFAULT;
 
     if ((fd = get_sock_fd(s, 0, NULL)) == -1)
@@ -3451,6 +3451,12 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
     TRACE("%04lx, %s, %p, %d, %p, %d, %p, %p, %p\n",
           s, debugstr_wsaioctl(code), in_buff, in_size, out_buff, out_size, ret_size, overlapped, completion);
 
+    if (!ret_size)
+    {
+        SetLastError( WSAEFAULT );
+        return -1;
+    }
+
     switch (code)
     {
     case WS_FIONBIO:
@@ -3544,12 +3550,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
 
         TRACE("-> SIO_ADDRESS_LIST_QUERY request\n");
 
-        if (!ret_size)
-        {
-            SetLastError(WSAEFAULT);
-            return SOCKET_ERROR;
-        }
-
         if (out_size && out_size < FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address[0]))
         {
             *ret_size = 0;
@@ -3718,7 +3718,7 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
        TRACE("-> WS_SIO_ROUTING_INTERFACE_QUERY request\n");
 
        if (!in_buff || in_size < sizeof(struct WS_sockaddr) ||
-           !out_buff || out_size < sizeof(struct WS_sockaddr_in) || !ret_size)
+           !out_buff || out_size < sizeof(struct WS_sockaddr_in))
        {
            SetLastError(WSAEFAULT);
            return SOCKET_ERROR;
@@ -3816,7 +3816,7 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
 
     if (!status)
     {
-        if (ret_size) *ret_size = total;
+        *ret_size = total;
         return 0;
     }
     SetLastError( status );
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index b5be63d9995..bf8d028611f 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3705,8 +3705,8 @@ static void test_fionread_siocatmark(void)
 
     WSASetLastError(0xdeadbeef);
     ret = WSAIoctl(client, FIONREAD, NULL, 0, &value, sizeof(value), NULL, NULL, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
@@ -3717,8 +3717,8 @@ static void test_fionread_siocatmark(void)
 
     WSASetLastError(0xdeadbeef);
     ret = WSAIoctl(client, SIOCATMARK, NULL, 0, &value, sizeof(value), NULL, NULL, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
@@ -3732,12 +3732,12 @@ static void test_fionread_siocatmark(void)
     port = CreateIoCompletionPort((HANDLE)client, NULL, 123, 0);
 
     ret = WSAIoctl(client, FIONREAD, NULL, 0, &value, sizeof(value), NULL, &overlapped, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     ret = WSAIoctl(client, SIOCATMARK, NULL, 0, &value, sizeof(value), NULL, &overlapped, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
@@ -3857,12 +3857,12 @@ static void test_fionread_siocatmark(void)
     server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
     ret = WSAIoctl(server, FIONREAD, NULL, 0, &value, sizeof(value), NULL, &overlapped, socket_apc);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     ret = WSAIoctl(server, SIOCATMARK, NULL, 0, &value, sizeof(value), NULL, &overlapped, socket_apc);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     apc_count = 0;
     size = 0xdeadbeef;
@@ -3920,8 +3920,8 @@ static void test_fionbio(void)
 
     WSASetLastError(0xdeadbeef);
     ret = WSAIoctl(s, FIONBIO, &one, sizeof(one), NULL, 0, NULL, NULL, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     ret = WSAIoctl(s, FIONBIO, &one, sizeof(one) - 1, NULL, 0, &size, &overlapped, NULL);
     ok(ret == -1, "expected failure\n");
@@ -3952,7 +3952,7 @@ static void test_fionbio(void)
     ok(!overlapped.InternalHigh, "got size %Iu\n", overlapped.InternalHigh);
 
     ret = WSAIoctl(s, FIONBIO, &one, sizeof(one), NULL, 0, NULL, &overlapped, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
+    ok(ret == -1, "expected failure\n");
     ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     ret = WSAEventSelect(s, event, FD_READ);
@@ -3974,8 +3974,8 @@ static void test_fionbio(void)
     s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
     ret = WSAIoctl(s, FIONBIO, &one, sizeof(one), NULL, 0, NULL, &overlapped, socket_apc);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     apc_count = 0;
     size = 0xdeadbeef;
@@ -4033,12 +4033,12 @@ static void test_keepalive_vals(void)
     ok(!size, "got size %u\n", size);
 
     ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(kalive), NULL, 0, NULL, NULL, NULL);
-    todo_wine ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(kalive), NULL, 0, NULL, &overlapped, NULL);
-    todo_wine ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == SOCKET_ERROR, "WSAIoctl succeeded unexpectedly\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
@@ -4093,8 +4093,8 @@ static void test_keepalive_vals(void)
     sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
     ret = WSAIoctl(sock, SIO_KEEPALIVE_VALS, &kalive, sizeof(kalive), NULL, 0, NULL, &overlapped, socket_apc);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     apc_count = 0;
     size = 0xdeadbeef;
@@ -4135,9 +4135,8 @@ static void test_unsupported_ioctls(void)
 
         WSASetLastError(0xdeadbeef);
         ret = WSAIoctl(s, codes[i], NULL, 0, NULL, 0, NULL, &overlapped, NULL);
-        todo_wine_if (codes[i] == SIO_FLUSH)
-            ok(ret == -1, "expected failure\n");
-        todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+        ok(ret == -1, "expected failure\n");
+        ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
         WSASetLastError(0xdeadbeef);
         size = 0xdeadbeef;
@@ -4182,9 +4181,8 @@ static void test_unsupported_ioctls(void)
         s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 
         ret = WSAIoctl(s, codes[i], NULL, 0, NULL, 0, NULL, &overlapped, socket_apc);
-        todo_wine_if (codes[i] == SIO_FLUSH)
-            ok(ret == -1, "expected failure\n");
-        todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+        ok(ret == -1, "expected failure\n");
+        ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
         apc_count = 0;
         size = 0xdeadbeef;
@@ -4228,8 +4226,8 @@ static void test_get_extension_func(void)
     WSASetLastError(0xdeadbeef);
     ret = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptex_guid, sizeof(GUID),
             &func, sizeof(func), NULL, &overlapped, NULL);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     WSASetLastError(0xdeadbeef);
     size = 0xdeadbeef;
@@ -4269,7 +4267,7 @@ static void test_get_extension_func(void)
     todo_wine ok(overlapped.InternalHigh == 0xdeadbeef, "got size %Iu\n", overlapped.InternalHigh);
 
     ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped_ptr, 0);
-    todo_wine ok(!ret, "expected failure\n");
+    ok(!ret, "expected failure\n");
     todo_wine ok(GetLastError() == WAIT_TIMEOUT, "got error %u\n", WSAGetLastError());
 
     CloseHandle(port);
@@ -4279,8 +4277,8 @@ static void test_get_extension_func(void)
 
     ret = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &acceptex_guid, sizeof(GUID),
             &func, sizeof(func), NULL, &overlapped, socket_apc);
-    todo_wine ok(ret == -1, "expected failure\n");
-    todo_wine ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
+    ok(ret == -1, "expected failure\n");
+    ok(WSAGetLastError() == WSAEFAULT, "got error %u\n", WSAGetLastError());
 
     apc_count = 0;
     size = 0xdeadbeef;
-- 
2.30.2




More information about the wine-devel mailing list