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