Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- v2: - Remove duplicate error value tests - Use memcmp - Test IPv6 flowinfo field too --- dlls/ws2_32/tests/sock.c | 380 ++++++++++++++------------------------- 1 file changed, 130 insertions(+), 250 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index b17f076a40..ad8d95013a 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3412,266 +3412,147 @@ 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]; + ULONG address; + USHORT 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]; + USHORT address[8]; + USHORT 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 ); +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 ); +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( memcmp(&sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr)) == 0, + "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 ); + ok( sockaddr6.sin6_flowinfo == 0, + "WSAStringToAddress(%s) gave flowinfo %d, expected 0\n", + wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_flowinfo ); + } + } }
static DWORD WINAPI SelectReadThread(void *param) @@ -11677,8 +11558,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, and that WSAStringToAddress has the same bug with leading double colons as RtlIpv6StringToAddress.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com --- v2: Add test for leading double colon bug --- dlls/ws2_32/socket.c | 82 +++++++--------------------------------- dlls/ws2_32/tests/sock.c | 10 +++-- 2 files changed, 20 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 ad8d95013a..957f0c90af 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,10 @@ 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:5:6:7", { 0, 0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600 }, 0, WSAEINVAL }, /* Windows bug */ + { "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]; @@ -3485,11 +3491,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 ); @@ -3526,11 +3530,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( memcmp(&sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr)) == 0, "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 ),
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=71918
Your paranoid android.
=== w1064v1809 (32 bit report) ===
ws2_32: sock.c:6098: Test failed: Expected event sequence [FD_WRITE(0)], got [] sock.c:6119: Test failed: Expected event sequence [FD_READ(0) FD_CLOSE(0)], got [FD_READ(0) FD_WRITE(0) FD_CLOSE(10053)] sock.c:6122: Test failed: Failed to empty buffer: -1 - 10054 sock.c:6123: Test failed: Expected event sequence [FD_READ(0)], got [] sock.c:6126: Test failed: Failed to empty buffer: -1 - 10054