Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ws2_32/tests/sock.c | 390 ++++++++++++++------------------------- 1 file changed, 140 insertions(+), 250 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index b17f076a40..d77ee833cd 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3412,266 +3412,157 @@ end: closesocket(v6); }
-static void test_WSAStringToAddressA(void) +static void test_WSAStringToAddress(void) { - INT ret, len; - SOCKADDR_IN sockaddr; - SOCKADDR_IN6 sockaddr6; - int GLE; - - CHAR address1[] = "0.0.0.0"; - CHAR address2[] = "127.127.127.127"; - CHAR address3[] = "255.255.255.255"; - CHAR address4[] = "127.127.127.127:65535"; - CHAR address5[] = "255.255.255.255:65535"; - CHAR address6[] = "::1"; - CHAR address7[] = "[::1]"; - CHAR address8[] = "[::1]:65535"; - CHAR address9[] = "2001::1"; - - len = 0; - sockaddr.sin_family = AF_INET; - - ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n", - WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0, - "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f, - "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || - (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), - "WSAStringToAddressA() failed unexpectedly: %d\n", GLE ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff, - "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || - (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), - "WSAStringToAddressA() failed unexpectedly: %d\n", GLE ); - - len = sizeof(sockaddr); - - ret = WSAStringToAddressA( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressA() should have failed with %d\n", GLE ); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - if (ret == SOCKET_ERROR) + static struct { - win_skip("IPv6 not supported\n"); - return; + char input[32]; + UINT32 address; + UINT16 port; + int error; } + ipv4_tests[] = + { + { "0.0.0.0", 0 }, + { "127.127.127.127", 0x7f7f7f7f }, + { "255.255.255.255", 0xffffffff }, + { "127.127.127.127:65535", 0x7f7f7f7f, 65535 }, + { "255.255.255.255:65535", 0xffffffff, 65535 }, + { "2001::1", 0xd1070000, 0, WSAEINVAL }, + }; + static struct + { + char input[64]; + UINT16 address[8]; + UINT16 port; + int error; + } + ipv6_tests[] = + { + { "::1", { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, + { "[::1]", { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, + { "[::1]:65535", { 0, 0, 0, 0, 0, 0, 0, 0x100 }, 0xffff }, + { "2001::1", { 0x120, 0, 0, 0, 0, 0, 0, 0x100 } }, + { "::1]:65535", { 0, 0, 0, 0, 0, 0, 0, 0x100 }, 0, WSAEINVAL }, + { "001::1", { 0x100, 0, 0, 0, 0, 0, 0, 0x100 } }, + };
- GLE = WSAGetLastError(); - ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - GLE = WSAGetLastError(); - ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - GLE = WSAGetLastError(); - ok( ret == 0 && sockaddr6.sin6_port == 0xffff, - "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); - - ret = WSAStringToAddressA( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressW() should have failed with %d\n", GLE ); - - len = sizeof(sockaddr6); - - ret = WSAStringToAddressA( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressW() should have failed with %d\n", GLE ); -} - -static void test_WSAStringToAddressW(void) -{ - INT ret, len; - SOCKADDR_IN sockaddr, *sin; + WCHAR inputW[64]; + INT len, ret, expected_ret; + short expected_family; + SOCKADDR_IN sockaddr; SOCKADDR_IN6 sockaddr6; - SOCKADDR_STORAGE sockaddr_storage; - int GLE; - - WCHAR address1[] = { '0','.','0','.','0','.','0', 0 }; - WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 }; - WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 }; - WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', - ':', '6', '5', '5', '3', '5', 0 }; - WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':', - '6', '5', '5', '3', '5', 0 }; - WCHAR address6[] = {':',':','1','\0'}; - WCHAR address7[] = {'[',':',':','1',']','\0'}; - WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'}; - WCHAR address9[] = {'2','0','0','1',':',':','1','\0'}; + int i, j;
len = 0; - sockaddr.sin_family = AF_INET; - - ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n", - WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0, - "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; + WSASetLastError( 0 ); + ret = WSAStringToAddressA( ipv4_tests[0].input, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); + ok( ret == SOCKET_ERROR, "WSAStringToAddressA() returned %d, expected SOCKET_ERROR\n", ret ); + ok( WSAGetLastError() == WSAEFAULT, "WSAStringToAddress() gave error %d, expected WSAEFAULT\n", WSAGetLastError() );
- ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f, - "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) || - (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), - "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff, - "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() ); - - len = sizeof(sockaddr); - sockaddr.sin_port = 0; - sockaddr.sin_addr.s_addr = 0; - - ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) || - (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), - "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); - - /* Test with a larger buffer than necessary */ - len = sizeof(sockaddr_storage); - sin = (SOCKADDR_IN *)&sockaddr_storage; - sin->sin_port = 0; - sin->sin_addr.s_addr = 0; - - ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len ); - ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) || - (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)), - "WSAStringToAddressW() failed unexpectedly: %d\n", GLE ); - ok( len == sizeof(SOCKADDR_IN), "unexpected length %d\n", len ); - - len = sizeof(sockaddr); - - ret = WSAStringToAddressW( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressW() should have failed with %d\n", GLE ); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - if (ret == SOCKET_ERROR) + for (i = 0; i < 2; i++) { - win_skip("IPv6 not supported\n"); - return; - } - - GLE = WSAGetLastError(); - ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - GLE = WSAGetLastError(); - ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); - memset(&sockaddr6, 0, len); - sockaddr6.sin6_family = AF_INET6; - - ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, - &len ); - GLE = WSAGetLastError(); - ok( ret == 0 && sockaddr6.sin6_port == 0xffff, - "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE); - - len = sizeof(sockaddr6); + for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++) + { + len = sizeof(sockaddr); + memset( &sockaddr, 0xab, len );
- ret = WSAStringToAddressW( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressW() should have failed with %d\n", GLE ); + WSASetLastError( 0 ); + if (i == 0) + { + ret = WSAStringToAddressA( ipv4_tests[j].input, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); + } + else + { + MultiByteToWideChar( CP_ACP, 0, ipv4_tests[j].input, -1, inputW, ARRAY_SIZE(inputW) ); + ret = WSAStringToAddressW( inputW, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len ); + } + expected_ret = ipv4_tests[j].error ? SOCKET_ERROR : 0; + expected_family = ipv4_tests[j].error ? 0 : AF_INET; + ok( ret == expected_ret, + "WSAStringToAddress(%s) returned %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), ret, expected_ret ); + ok( WSAGetLastError() == ipv4_tests[j].error, + "WSAStringToAddress(%s) gave error %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), WSAGetLastError(), ipv4_tests[j].error ); + ok( WSAGetLastError() == ipv4_tests[j].error, + "WSAStringToAddress(%s) gave error %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), WSAGetLastError(), ipv4_tests[j].error ); +todo_wine_if(ipv4_tests[j].error) + ok( sockaddr.sin_family == expected_family, + "WSAStringToAddress(%s) gave family %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_family, expected_family ); +todo_wine_if(ipv4_tests[j].error) + ok( sockaddr.sin_addr.s_addr == ipv4_tests[j].address, + "WSAStringToAddress(%s) gave address %08x, expected %08x\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_addr.s_addr, ipv4_tests[j].address ); + ok( sockaddr.sin_port == ipv4_tests[j].port, + "WSAStringToAddress(%s) gave port %04x, expected %04x\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_port, ipv4_tests[j].port ); + }
- len = sizeof(sockaddr6); + for (j = 0; j < ARRAY_SIZE(ipv6_tests); j++) + { + len = sizeof(sockaddr6); + memset( &sockaddr6, 0xab, len );
- ret = WSAStringToAddressW( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len ); - GLE = WSAGetLastError(); - ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL), - "WSAStringToAddressW() should have failed with %d\n", GLE ); + WSASetLastError( 0 ); + if (i == 0) + { + ret = WSAStringToAddressA( ipv6_tests[j].input, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, &len ); + } + else + { + MultiByteToWideChar( CP_ACP, 0, ipv6_tests[j].input, -1, inputW, ARRAY_SIZE(inputW) ); + ret = WSAStringToAddressW( inputW, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, &len ); + } + if (j == 0 && ret == SOCKET_ERROR) + { + win_skip("IPv6 not supported\n"); + break; + } + expected_ret = ipv6_tests[j].error ? SOCKET_ERROR : 0; + expected_family = ipv6_tests[j].error ? 0 : AF_INET6; + ok( ret == expected_ret, + "WSAStringToAddress(%s) returned %d, expected %d\n", + wine_dbgstr_a( ipv6_tests[j].input ), ret, expected_ret ); + ok( WSAGetLastError() == ipv6_tests[j].error, + "WSAStringToAddress(%s) gave error %d, expected %d\n", + wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error ); + ok( WSAGetLastError() == ipv6_tests[j].error, + "WSAStringToAddress(%s) gave error %d, expected %d\n", + wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error ); +todo_wine_if(ipv6_tests[j].error) + ok( sockaddr6.sin6_family == expected_family, + "WSAStringToAddress(%s) gave family %d, expected %d\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_family ); +todo_wine_if(ipv6_tests[j].error) + ok( sockaddr6.sin6_addr.s6_words[0] == ipv6_tests[j].address[0] && + sockaddr6.sin6_addr.s6_words[1] == ipv6_tests[j].address[1] && + sockaddr6.sin6_addr.s6_words[2] == ipv6_tests[j].address[2] && + sockaddr6.sin6_addr.s6_words[3] == ipv6_tests[j].address[3] && + sockaddr6.sin6_addr.s6_words[4] == ipv6_tests[j].address[4] && + sockaddr6.sin6_addr.s6_words[5] == ipv6_tests[j].address[5] && + sockaddr6.sin6_addr.s6_words[6] == ipv6_tests[j].address[6] && + sockaddr6.sin6_addr.s6_words[7] == ipv6_tests[j].address[7], + "WSAStringToAddress(%s) gave address %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n", + wine_dbgstr_a( ipv6_tests[j].input ), + sockaddr6.sin6_addr.s6_words[0], sockaddr6.sin6_addr.s6_words[1], + sockaddr6.sin6_addr.s6_words[2], sockaddr6.sin6_addr.s6_words[3], + sockaddr6.sin6_addr.s6_words[4], sockaddr6.sin6_addr.s6_words[5], + sockaddr6.sin6_addr.s6_words[6], sockaddr6.sin6_addr.s6_words[7], + ipv6_tests[j].address[0], ipv6_tests[j].address[1], + ipv6_tests[j].address[2], ipv6_tests[j].address[3], + ipv6_tests[j].address[4], ipv6_tests[j].address[5], + ipv6_tests[j].address[6], ipv6_tests[j].address[7] ); + ok( sockaddr6.sin6_scope_id == 0, + "WSAStringToAddress(%s) gave scope %d, expected 0\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_scope_id ); + ok( sockaddr6.sin6_port == ipv6_tests[j].port, + "WSAStringToAddress(%s) gave port %04x, expected %04x\n", + wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_port, ipv6_tests[j].port ); + } + } }
static DWORD WINAPI SelectReadThread(void *param) @@ -11677,8 +11568,7 @@ START_TEST( sock ) test_WSAAddressToStringA(); test_WSAAddressToStringW();
- test_WSAStringToAddressA(); - test_WSAStringToAddressW(); + test_WSAStringToAddress();
test_errors(); test_listen();
And add tests to show that the address is always zeroed out even if there is an error.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- dlls/ws2_32/socket.c | 82 +++++++--------------------------------- dlls/ws2_32/tests/sock.c | 9 +++-- 2 files changed, 19 insertions(+), 72 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index d688994e62..a5df51d421 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -154,6 +154,7 @@ #include "winnt.h" #define USE_WC_PREFIX /* For CMSG_DATA */ #include "iphlpapi.h" +#include "ip2string.h" #include "wine/server.h" #include "wine/debug.h" #include "wine/exception.h" @@ -8484,7 +8485,7 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, LPINT lpAddressLength) { INT res=0; - LPSTR workBuffer=NULL,ptrPort; + NTSTATUS status;
TRACE( "(%s, %x, %p, %p, %p)\n", debugstr_a(AddressString), AddressFamily, lpProtocolInfo, lpAddress, lpAddressLength ); @@ -8500,21 +8501,11 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, if (lpProtocolInfo) FIXME("ProtocolInfo not implemented.\n");
- workBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - strlen(AddressString) + 1); - if (!workBuffer) - { - SetLastError(WSA_NOT_ENOUGH_MEMORY); - return SOCKET_ERROR; - } - - strcpy(workBuffer, AddressString); - switch(AddressFamily) { case WS_AF_INET: { - struct in_addr inetaddr; + SOCKADDR_IN *addr4 = (SOCKADDR_IN *)lpAddress;
/* If lpAddressLength is too small, tell caller the size we need */ if (*lpAddressLength < sizeof(SOCKADDR_IN)) @@ -8526,35 +8517,18 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, *lpAddressLength = sizeof(SOCKADDR_IN); memset(lpAddress, 0, sizeof(SOCKADDR_IN));
- ((LPSOCKADDR_IN)lpAddress)->sin_family = WS_AF_INET; - - ptrPort = strchr(workBuffer, ':'); - if(ptrPort) - { - /* User may have entered an IPv6 and asked to parse as IPv4 */ - if(strchr(ptrPort + 1, ':')) - { - res = WSAEINVAL; - break; - } - ((LPSOCKADDR_IN)lpAddress)->sin_port = htons(atoi(ptrPort+1)); - *ptrPort = '\0'; - } - - if(inet_aton(workBuffer, &inetaddr) > 0) + status = RtlIpv4StringToAddressExA(AddressString, FALSE, &addr4->sin_addr, &addr4->sin_port); + if (status != STATUS_SUCCESS) { - ((LPSOCKADDR_IN)lpAddress)->sin_addr.WS_s_addr = inetaddr.s_addr; - res = 0; - } - else res = WSAEINVAL; - + break; + } + addr4->sin_family = WS_AF_INET; break; } case WS_AF_INET6: { - struct in6_addr inetaddr; - char *ptrAddr = workBuffer; + SOCKADDR_IN6 *addr6 = (SOCKADDR_IN6 *)lpAddress;
/* If lpAddressLength is too small, tell caller the size we need */ if (*lpAddressLength < sizeof(SOCKADDR_IN6)) @@ -8563,42 +8537,16 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, res = WSAEFAULT; break; } -#ifdef HAVE_INET_PTON *lpAddressLength = sizeof(SOCKADDR_IN6); memset(lpAddress, 0, sizeof(SOCKADDR_IN6));
- ((LPSOCKADDR_IN6)lpAddress)->sin6_family = WS_AF_INET6; - - /* Valid IPv6 addresses can also be surrounded by [ ], and in this case - * a port number may follow after like in [fd12:3456:7890::1]:12345 - * We need to cut the brackets and find the port if any. */ - - if(*workBuffer == '[') - { - ptrPort = strchr(workBuffer, ']'); - if (!ptrPort) - { - SetLastError(WSAEINVAL); - return SOCKET_ERROR; - } - - if (ptrPort[1] == ':') - ((LPSOCKADDR_IN6)lpAddress)->sin6_port = htons(atoi(ptrPort + 2)); - - *ptrPort = '\0'; - ptrAddr = workBuffer + 1; - } - - if(inet_pton(AF_INET6, ptrAddr, &inetaddr) > 0) + status = RtlIpv6StringToAddressExA(AddressString, &addr6->sin6_addr, &addr6->sin6_scope_id, &addr6->sin6_port); + if (status != STATUS_SUCCESS) { - memcpy(&((LPSOCKADDR_IN6)lpAddress)->sin6_addr, &inetaddr, - sizeof(struct in6_addr)); - res = 0; - } - else -#endif /* HAVE_INET_PTON */ res = WSAEINVAL; - + break; + } + addr6->sin6_family = WS_AF_INET6; break; } default: @@ -8607,8 +8555,6 @@ INT WINAPI WSAStringToAddressA(LPSTR AddressString, res = WSAEINVAL; }
- HeapFree(GetProcessHeap(), 0, workBuffer); - if (!res) return 0; SetLastError(res); return SOCKET_ERROR; diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index d77ee833cd..85933f7386 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3429,6 +3429,8 @@ static void test_WSAStringToAddress(void) { "127.127.127.127:65535", 0x7f7f7f7f, 65535 }, { "255.255.255.255:65535", 0xffffffff, 65535 }, { "2001::1", 0xd1070000, 0, WSAEINVAL }, + { "1.2.3.", 0, 0, WSAEINVAL }, + { "", 0, 0, WSAEINVAL }, }; static struct { @@ -3445,6 +3447,9 @@ static void test_WSAStringToAddress(void) { "2001::1", { 0x120, 0, 0, 0, 0, 0, 0, 0x100 } }, { "::1]:65535", { 0, 0, 0, 0, 0, 0, 0, 0x100 }, 0, WSAEINVAL }, { "001::1", { 0x100, 0, 0, 0, 0, 0, 0, 0x100 } }, + { "1.2.3.4", { 0x201, 0x3, 0, 0, 0, 0, 0, 0 }, 0, WSAEINVAL }, + { "1:2:3:", { 0x100, 0x200, 0x300, 0, 0, 0, 0 }, 0, WSAEINVAL }, + { "", { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, WSAEINVAL }, };
WCHAR inputW[64]; @@ -3488,11 +3493,9 @@ static void test_WSAStringToAddress(void) ok( WSAGetLastError() == ipv4_tests[j].error, "WSAStringToAddress(%s) gave error %d, expected %d\n", wine_dbgstr_a( ipv4_tests[j].input ), WSAGetLastError(), ipv4_tests[j].error ); -todo_wine_if(ipv4_tests[j].error) ok( sockaddr.sin_family == expected_family, "WSAStringToAddress(%s) gave family %d, expected %d\n", wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_family, expected_family ); -todo_wine_if(ipv4_tests[j].error) ok( sockaddr.sin_addr.s_addr == ipv4_tests[j].address, "WSAStringToAddress(%s) gave address %08x, expected %08x\n", wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_addr.s_addr, ipv4_tests[j].address ); @@ -3532,11 +3535,9 @@ todo_wine_if(ipv4_tests[j].error) ok( WSAGetLastError() == ipv6_tests[j].error, "WSAStringToAddress(%s) gave error %d, expected %d\n", wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error ); -todo_wine_if(ipv6_tests[j].error) ok( sockaddr6.sin6_family == expected_family, "WSAStringToAddress(%s) gave family %d, expected %d\n", wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_family ); -todo_wine_if(ipv6_tests[j].error) ok( sockaddr6.sin6_addr.s6_words[0] == ipv6_tests[j].address[0] && sockaddr6.sin6_addr.s6_words[1] == ipv6_tests[j].address[1] && sockaddr6.sin6_addr.s6_words[2] == ipv6_tests[j].address[2] &&
On 5/15/20 9:54 AM, Alex Henrie wrote:
ok( WSAGetLastError() == ipv6_tests[j].error,
"WSAStringToAddress(%s) gave error %d, expected %d\n",
wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error );
ok( WSAGetLastError() == ipv6_tests[j].error,
"WSAStringToAddress(%s) gave error %d, expected %d\n",
wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error );
I think you accidentally duplicated this line.
+todo_wine_if(ipv6_tests[j].error)
ok( sockaddr6.sin6_family == expected_family,
"WSAStringToAddress(%s) gave family %d, expected %d\n",
wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_family );
+todo_wine_if(ipv6_tests[j].error)
ok( sockaddr6.sin6_addr.s6_words[0] == ipv6_tests[j].address[0] &&
sockaddr6.sin6_addr.s6_words[1] == ipv6_tests[j].address[1] &&
sockaddr6.sin6_addr.s6_words[2] == ipv6_tests[j].address[2] &&
sockaddr6.sin6_addr.s6_words[3] == ipv6_tests[j].address[3] &&
sockaddr6.sin6_addr.s6_words[4] == ipv6_tests[j].address[4] &&
sockaddr6.sin6_addr.s6_words[5] == ipv6_tests[j].address[5] &&
sockaddr6.sin6_addr.s6_words[6] == ipv6_tests[j].address[6] &&
sockaddr6.sin6_addr.s6_words[7] == ipv6_tests[j].address[7],
Could this just be memcmp()? (Could the whole structure be compared that way?)
"WSAStringToAddress(%s) gave address %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n",
wine_dbgstr_a( ipv6_tests[j].input ),
sockaddr6.sin6_addr.s6_words[0], sockaddr6.sin6_addr.s6_words[1],
sockaddr6.sin6_addr.s6_words[2], sockaddr6.sin6_addr.s6_words[3],
sockaddr6.sin6_addr.s6_words[4], sockaddr6.sin6_addr.s6_words[5],
sockaddr6.sin6_addr.s6_words[6], sockaddr6.sin6_addr.s6_words[7],
ipv6_tests[j].address[0], ipv6_tests[j].address[1],
ipv6_tests[j].address[2], ipv6_tests[j].address[3],
ipv6_tests[j].address[4], ipv6_tests[j].address[5],
ipv6_tests[j].address[6], ipv6_tests[j].address[7] );
ok( sockaddr6.sin6_scope_id == 0,
"WSAStringToAddress(%s) gave scope %d, expected 0\n",
wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_scope_id );
ok( sockaddr6.sin6_port == ipv6_tests[j].port,
"WSAStringToAddress(%s) gave port %04x, expected %04x\n",
wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_port, ipv6_tests[j].port );
}
} }
static DWORD WINAPI SelectReadThread(void *param)
On Fri, May 15, 2020 at 9:19 AM Zebediah Figura z.figura12@gmail.com wrote:
On 5/15/20 9:54 AM, Alex Henrie wrote:
ok( WSAGetLastError() == ipv6_tests[j].error,
"WSAStringToAddress(%s) gave error %d, expected %d\n",
wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error );
ok( WSAGetLastError() == ipv6_tests[j].error,
"WSAStringToAddress(%s) gave error %d, expected %d\n",
wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error );
I think you accidentally duplicated this line.
Good catch, thanks!
+todo_wine_if(ipv6_tests[j].error)
ok( sockaddr6.sin6_family == expected_family,
"WSAStringToAddress(%s) gave family %d, expected %d\n",
wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_family );
+todo_wine_if(ipv6_tests[j].error)
ok( sockaddr6.sin6_addr.s6_words[0] == ipv6_tests[j].address[0] &&
sockaddr6.sin6_addr.s6_words[1] == ipv6_tests[j].address[1] &&
sockaddr6.sin6_addr.s6_words[2] == ipv6_tests[j].address[2] &&
sockaddr6.sin6_addr.s6_words[3] == ipv6_tests[j].address[3] &&
sockaddr6.sin6_addr.s6_words[4] == ipv6_tests[j].address[4] &&
sockaddr6.sin6_addr.s6_words[5] == ipv6_tests[j].address[5] &&
sockaddr6.sin6_addr.s6_words[6] == ipv6_tests[j].address[6] &&
sockaddr6.sin6_addr.s6_words[7] == ipv6_tests[j].address[7],
Could this just be memcmp()? (Could the whole structure be compared that way?)
Yes, the address comparison could just use memcmp. I will send an updated version with that change. I don't want to compare the entire structure with memcmp though because it would result in repeating {AF_INET6, 0, 0, {<address>}} a lot in the test table to represent the address family, port, and flowinfo.
-Alex
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=71832
Your paranoid android.
=== w8 (32 bit report) ===
ws2_32: sock.c:8636: Test failed: bytesReturned isn't supposed to be 1 sock.c:8660: Test failed: GetOverlappedResult failed, error 0
=== w1064v1809_he (32 bit report) ===
ws2_32: sock.c:7598: Test failed: wait failed sock.c:7600: Test failed: overlapped result is 10036 sock.c:7602: Test failed: overlapped.Internal = 2734 sock.c:7603: Test failed: overlapped.Pointer != &result sock.c:7604: Test failed: result == NULL