Zebediah Figura : ws2_32/tests: Add more tests for passing short buffers to AcceptEx().

Alexandre Julliard julliard at winehq.org
Fri Oct 16 15:55:39 CDT 2020


Module: wine
Branch: master
Commit: 0c249e6125fc9dc6ee86b4ef6ae0d9fa2fc6291b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0c249e6125fc9dc6ee86b4ef6ae0d9fa2fc6291b

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Fri Oct 16 14:57:31 2020 -0500

ws2_32/tests: Add more tests for passing short buffers to AcceptEx().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/tests/sock.c | 105 +++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 98 insertions(+), 7 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index e92442eb00d..5fb85bfaa60 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -7334,6 +7334,7 @@ static void test_AcceptEx(void)
     DWORD dwret;
 
     memset(&overlapped, 0, sizeof(overlapped));
+    overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
 
     listener = socket(AF_INET, SOCK_STREAM, 0);
     ok(listener != INVALID_SOCKET, "failed to create socket, error %u\n", WSAGetLastError());
@@ -7341,9 +7342,6 @@ static void test_AcceptEx(void)
     acceptor = socket(AF_INET, SOCK_STREAM, 0);
     ok(acceptor != INVALID_SOCKET, "failed to create socket, error %u\n", WSAGetLastError());
 
-    connector = socket(AF_INET, SOCK_STREAM, 0);
-    ok(connector != INVALID_SOCKET, "failed to create socket, error %u\n", WSAGetLastError());
-
     memset(&bindAddress, 0, sizeof(bindAddress));
     bindAddress.sin_family = AF_INET;
     bindAddress.sin_addr.s_addr = inet_addr("127.0.0.1");
@@ -7408,8 +7406,101 @@ todo_wine
         "AcceptEx on too small local address size returned %d + errno %d\n",
         bret, WSAGetLastError());
     ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal);
-    bret = CancelIo((HANDLE) listener);
-    ok(bret, "Failed to cancel pending accept socket\n");
+
+    connector = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(connector != -1, "failed to create socket, error %u\n", WSAGetLastError());
+    iret = connect(connector, (struct sockaddr *)&bindAddress, sizeof(bindAddress));
+    ok(!iret, "failed to connect, error %u\n", WSAGetLastError());
+    iret = getsockname(connector, (struct sockaddr *)&peerAddress, &remoteSize);
+    ok(!iret, "getsockname failed, error %u\n", WSAGetLastError());
+
+    dwret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!dwret, "wait failed\n");
+    bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
+    ok(bret, "got error %u\n", GetLastError());
+    ok(!(NTSTATUS)overlapped.Internal, "got %#lx\n", overlapped.Internal);
+    ok(!bytesReturned, "got size %u\n", bytesReturned);
+
+    readBindAddress = readRemoteAddress = (struct sockaddr_in *)0xdeadbeef;
+    localSize = remoteSize = 0xdeadbeef;
+    pGetAcceptExSockaddrs(buffer, 0, 0, sizeof(struct sockaddr_in) + 16,
+            (struct sockaddr **)&readBindAddress, &localSize, (struct sockaddr **)&readRemoteAddress, &remoteSize);
+    todo_wine ok(readBindAddress == (struct sockaddr_in *)0xdeadbeef, "got local addr %p\n", readBindAddress);
+    ok(!memcmp(readRemoteAddress, &peerAddress, sizeof(peerAddress)), "remote addr didn't match\n");
+    todo_wine ok(localSize == 0xdeadbeef, "got local size %u\n", localSize);
+    ok(remoteSize == sizeof(struct sockaddr_in), "got remote size %u\n", remoteSize);
+
+    closesocket(connector);
+    closesocket(acceptor);
+
+    acceptor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(acceptor != -1, "failed to create socket, error %u\n", WSAGetLastError());
+
+    overlapped.Internal = 0xdeadbeef;
+    bret = pAcceptEx(listener, acceptor, buffer, 0, 3,
+            sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped);
+    ok(!bret && WSAGetLastError() == ERROR_IO_PENDING, "got %d, error %u\n", bret, WSAGetLastError());
+    ok((NTSTATUS)overlapped.Internal == STATUS_PENDING, "got %#lx\n", overlapped.Internal);
+
+    connector = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(connector != -1, "failed to create socket, error %u\n", WSAGetLastError());
+    iret = connect(connector, (struct sockaddr *)&bindAddress, sizeof(bindAddress));
+    ok(!iret, "failed to connect, error %u\n", WSAGetLastError());
+
+    dwret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!dwret, "wait failed\n");
+    bytesReturned = 0xdeadbeef;
+    SetLastError(0xdeadbeef);
+    bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
+    todo_wine ok(!bret, "expected failure\n");
+    todo_wine ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %u\n", GetLastError());
+    todo_wine ok((NTSTATUS)overlapped.Internal == STATUS_BUFFER_TOO_SMALL, "got %#lx\n", overlapped.Internal);
+    ok(!bytesReturned, "got size %u\n", bytesReturned);
+
+    closesocket(acceptor);
+
+    /* The above connection request is not accepted. */
+    acceptor = accept(listener, NULL, NULL);
+    todo_wine ok(acceptor != INVALID_SOCKET, "failed to accept, error %u\n", WSAGetLastError());
+    closesocket(acceptor);
+
+    closesocket(connector);
+
+    acceptor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(acceptor != -1, "failed to create socket, error %u\n", WSAGetLastError());
+
+    overlapped.Internal = 0xdeadbeef;
+    bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 4,
+            sizeof(struct sockaddr_in) + 16, &bytesReturned, &overlapped);
+    ok(!bret && WSAGetLastError() == ERROR_IO_PENDING, "got %d, error %u\n", bret, WSAGetLastError());
+    ok((NTSTATUS)overlapped.Internal == STATUS_PENDING, "got %#lx\n", overlapped.Internal);
+
+    connector = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(connector != -1, "failed to create socket, error %u\n", WSAGetLastError());
+    iret = connect(connector, (struct sockaddr *)&bindAddress, sizeof(bindAddress));
+    ok(!iret, "failed to connect, error %u\n", WSAGetLastError());
+
+    dwret = WaitForSingleObject(overlapped.hEvent, 1000);
+    ok(!dwret, "wait failed\n");
+    bytesReturned = 0xdeadbeef;
+    SetLastError(0xdeadbeef);
+    bret = GetOverlappedResult((HANDLE)listener, &overlapped, &bytesReturned, FALSE);
+    todo_wine ok(!bret, "expected failure\n");
+    todo_wine ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %u\n", GetLastError());
+    todo_wine ok((NTSTATUS)overlapped.Internal == STATUS_BUFFER_TOO_SMALL, "got %#lx\n", overlapped.Internal);
+    ok(!bytesReturned, "got size %u\n", bytesReturned);
+
+    closesocket(acceptor);
+
+    /* The above connection request is not accepted. */
+    acceptor = accept(listener, NULL, NULL);
+    todo_wine ok(acceptor != INVALID_SOCKET, "failed to accept, error %u\n", WSAGetLastError());
+    closesocket(acceptor);
+
+    closesocket(connector);
+
+    acceptor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(acceptor != -1, "failed to create socket, error %u\n", WSAGetLastError());
 
     overlapped.Internal = 0xdeadbeef;
     bret = pAcceptEx(listener, acceptor, buffer, 0, sizeof(struct sockaddr_in) + 15,
@@ -7447,8 +7538,6 @@ todo_wine
     ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "AcceptEx on a NULL overlapped "
         "returned %d + errno %d\n", bret, WSAGetLastError());
 
-    overlapped.hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
-
     overlapped.Internal = 0xdeadbeef;
     bret = pAcceptEx(listener, acceptor, buffer, 0,
         sizeof(struct sockaddr_in) + 16, sizeof(struct sockaddr_in) + 16,
@@ -7499,6 +7588,8 @@ todo_wine
         ok(overlapped.Internal == STATUS_PENDING, "got %08x\n", (ULONG)overlapped.Internal);
     }
 
+    connector = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+    ok(connector != -1, "failed to create socket, error %u\n", WSAGetLastError());
     overlapped.Internal = 0xdeadbeef;
     iret = connect(connector, (struct sockaddr*)&bindAddress, sizeof(bindAddress));
     ok(iret == 0, "connecting to accepting socket failed, error %d\n", WSAGetLastError());




More information about the wine-cvs mailing list