From: Ally Sommers dropbear.sh@gmail.com
--- dlls/ws2_32/tests/sock.c | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index cff4acb0b3c..c3373d872a8 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -13785,6 +13785,61 @@ static void test_connect_udp(void) closesocket(client); }
+static void test_tcp_sendto_recvfrom(void) +{ + SOCKET listener, client, server = 0; + SOCKADDR_IN addr = { AF_INET, SERVERPORT }; + SOCKADDR_IN bad_addr, bad_addr_copy; + const char serverMsg[] = "ws2_32/TCP socket test"; + char clientBuf[sizeof(serverMsg)] = { 0 }; + ULONG zero = 0; + ULONG one = 1; + int to_len = sizeof(bad_addr); + int ret; + + inet_pton(AF_INET, SERVERIP, &addr.sin_addr); + + listener = socket(AF_INET, SOCK_STREAM, 0); + ok(listener != INVALID_SOCKET, "Failed to create TCP socket: %d\n", WSAGetLastError()); + ret = bind(listener, (SOCKADDR *)&addr, sizeof(addr)); + ok(!ret, "Failed to bind TCP socket to %s: %d\n", SERVERIP, WSAGetLastError()); + ret = listen(listener, 0); + ok(!ret, "Failed to listen on TCP socket: %d\n", WSAGetLastError()); + + client = socket(AF_INET, SOCK_STREAM, 0); + ok(client != INVALID_SOCKET, "Failed to create TCP socket: %d\n", WSAGetLastError()); + ret = ioctlsocket(client, FIONBIO, &one); + ok(!ret, "Could not set TCP socket to nonblocking: %d; skipping connection\n", WSAGetLastError()); + if (!ret) + { + ret = connect(client, (SOCKADDR *)&addr, sizeof(addr)); + ok(ret == SOCKET_ERROR && GetLastError() == WSAEWOULDBLOCK, + "Incorrect error when connecting to TCP socket: %lu\n", + GetLastError()); + server = accept(listener, NULL, NULL); + ok(server != INVALID_SOCKET, "Could not accept TCP socket connection: %lu\n", + GetLastError()); + ret = ioctlsocket(client, FIONBIO, &zero); + ok(!ret, "Could not set TCP socket to blocking: %lun", GetLastError()); + } + + // Fill the address with invalid data + for (int i = 0; i < sizeof(bad_addr); i++) + ((char *)&bad_addr)[i] = sizeof(bad_addr) - i; + memcpy(&bad_addr_copy, &bad_addr, sizeof(bad_addr_copy)); + + ret = sendto(server, serverMsg, sizeof(serverMsg), 0, (SOCKADDR *)&bad_addr, sizeof(bad_addr)); + ok(ret == sizeof(serverMsg), "Incorrect return value from sendto: %d (%d)\n", ret, WSAGetLastError()); + ret = recvfrom(client, clientBuf, sizeof(clientBuf), 0, (SOCKADDR *)&bad_addr, &to_len); + ok(!memcmp(&bad_addr, &bad_addr_copy, sizeof(bad_addr)), "Provided address modified by recvfrom\n"); + ok(ret == sizeof(serverMsg), "Incorrect return value from recvfrom: %d (%d)\n", ret, WSAGetLastError()); + ok(!memcmp(serverMsg, clientBuf, sizeof(serverMsg)), "Data mismatch over TCP socket\n"); + + closesocket(listener); + closesocket(client); + closesocket(server); +} + START_TEST( sock ) { int i; @@ -13866,6 +13921,7 @@ START_TEST( sock ) test_tcp_reset(); test_icmp(); test_connect_udp(); + test_tcp_sendto_recvfrom();
/* this is an io heavy test, do it at the end so the kernel doesn't start dropping packets */ test_send();