Signed-off-by: Zebediah Figura z.figura12@gmail.com --- 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 90766873489..be0ece9fc1b 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -7335,6 +7335,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()); @@ -7342,9 +7343,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"); @@ -7409,8 +7407,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(!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(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(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(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(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, @@ -7448,8 +7539,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, @@ -7500,6 +7589,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());