Also fixes test failures on Windows 11.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=54045
-- v2: ntdll: Conform to Windows 11 behavior in RtlIpv6StringToAddress(). ws2_32/tests: Fix test failures on Windows 11.
From: Hans Leidekker hans@codeweavers.com
--- dlls/ws2_32/tests/protocol.c | 76 ++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 21 deletions(-)
diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c index fac3cf57077..01b4c2ba71e 100644 --- a/dlls/ws2_32/tests/protocol.c +++ b/dlls/ws2_32/tests/protocol.c @@ -406,7 +406,8 @@ static void test_WSALookupService(void)
ret = WSALookupServiceBeginW(qs, 0, &handle); ok(ret == SOCKET_ERROR, "WSALookupServiceBeginW should have failed\n"); - todo_wine ok(WSAGetLastError() == ERROR_INVALID_PARAMETER + todo_wine ok(WSAGetLastError() == WSAEINVAL + || broken(WSAGetLastError() == ERROR_INVALID_PARAMETER) || broken(WSAGetLastError() == WSASERVICE_NOT_FOUND) /* win10 1809 */, "got error %u\n", WSAGetLastError());
@@ -821,6 +822,8 @@ static void test_inet_pton(void) char input[64]; int ret; unsigned short addr[8]; + int broken; + int broken_ret; } ipv6_tests[] = { @@ -906,10 +909,8 @@ static void test_inet_pton(void) {"::0:0:0:0", 1, {0, 0, 0, 0, 0, 0, 0, 0}}, {"::0:0:0:0:0", 1, {0, 0, 0, 0, 0, 0, 0, 0}}, {"::0:0:0:0:0:0", 1, {0, 0, 0, 0, 0, 0, 0, 0}}, - /* this one and the next one are incorrectly parsed by windows, - it adds one zero too many in front, cutting off the last digit. */ - {"::0:0:0:0:0:0:0", 0, {0, 0, 0, 0, 0, 0, 0, 0}}, - {"::0:a:b:c:d:e:f", 0, {0, 0, 0, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00}}, + {"::0:0:0:0:0:0:0", 1, {0, 0, 0, 0, 0, 0, 0, 0}, 1}, + {"::0:a:b:c:d:e:f", 1, {0, 0, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00, 0xf00}, 1}, {"::123.123.123.123", 1, {0, 0, 0, 0, 0, 0, 0x7b7b, 0x7b7b}}, {"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 1, {0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}}, {"':10.0.0.1", 0, {0xabab, 0xabab, 0xabab, 0xabab, 0xabab, 0xabab, 0xabab, 0xabab}}, @@ -1076,17 +1077,31 @@ static void test_inet_pton(void) WSASetLastError(0xdeadbeef); memset(addr, 0xab, sizeof(addr)); ret = p_inet_pton(AF_INET6, ipv6_tests[i].input, addr); - ok(ret == ipv6_tests[i].ret, "got %d\n", ret); + if (ipv6_tests[i].broken) + todo_wine_if (i == 82 || i == 83) ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); + else + ok(ret == ipv6_tests[i].ret, "got %d\n", ret); ok(WSAGetLastError() == 0xdeadbeef, "got error %u\n", WSAGetLastError()); - ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n"); + if (ipv6_tests[i].broken) + todo_wine_if (i == 83) ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), + "address didn't match\n"); + else + ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n");
MultiByteToWideChar(CP_ACP, 0, ipv6_tests[i].input, -1, inputW, ARRAY_SIZE(inputW)); WSASetLastError(0xdeadbeef); memset(addr, 0xab, sizeof(addr)); ret = pInetPtonW(AF_INET6, inputW, addr); - ok(ret == ipv6_tests[i].ret, "got %d\n", ret); + if (ipv6_tests[i].broken) + todo_wine ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); + else + ok(ret == ipv6_tests[i].ret, "got %d\n", ret); ok(WSAGetLastError() == (ret ? 0xdeadbeef : WSAEINVAL), "got error %u\n", WSAGetLastError()); - ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n"); + if (ipv6_tests[i].broken) + todo_wine_if (i == 83) ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), + "address didn't match\n"); + else + ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n");
winetest_pop_context(); } @@ -1455,6 +1470,8 @@ static void test_WSAStringToAddress(void) USHORT address[8]; USHORT port; int error; + int broken; + int broken_error; } ipv6_tests[] = { @@ -1464,7 +1481,7 @@ 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:5:6:7", { 0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700 }, 0, 0, 1, WSAEINVAL }, { "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 }, @@ -1542,20 +1559,37 @@ static void test_WSAStringToAddress(void)
winetest_push_context( "addr %s", debugstr_a(ipv6_tests[j].input) );
- ok( ret == (ipv6_tests[j].error ? SOCKET_ERROR : 0), "got %d\n", ret ); - ok( WSAGetLastError() == ipv6_tests[j].error, "got error %d\n", WSAGetLastError() ); - ok( sockaddr6.sin6_family == (ipv6_tests[j].error ? 0 : AF_INET6), - "got family %#x\n", sockaddr6.sin6_family ); - ok( !memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) ), - "got addr %x:%x:%x:%x:%x:%x:%x:%x\n", - 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] ); + if (ipv6_tests[j].broken) + { + todo_wine ok( ret == (ipv6_tests[j].error ? SOCKET_ERROR : 0) || + broken(ret == (ipv6_tests[j].broken_error ? SOCKET_ERROR : 0)), "got %d\n", ret ); + todo_wine ok( WSAGetLastError() == ipv6_tests[j].error || + broken(WSAGetLastError() == ipv6_tests[j].broken_error), "got error %d\n", WSAGetLastError() ); + todo_wine ok( !memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) ) || + broken(memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) )), + "got addr %x:%x:%x:%x:%x:%x:%x:%x\n", + 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] ); + } + else + { + ok( ret == (ipv6_tests[j].error ? SOCKET_ERROR : 0), "got %d\n", ret ); + ok( WSAGetLastError() == ipv6_tests[j].error, "got error %d\n", WSAGetLastError() ); + ok( !memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) ), + "got addr %x:%x:%x:%x:%x:%x:%x:%x\n", + 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] ); + ok( sockaddr6.sin6_family == (ipv6_tests[j].error ? 0 : AF_INET6), + "got family %#x\n", sockaddr6.sin6_family ); + ok( len == expected_len, "got len %d\n", len ); + } ok( !sockaddr6.sin6_scope_id, "got scope id %lu\n", sockaddr6.sin6_scope_id ); ok( sockaddr6.sin6_port == ipv6_tests[j].port, "got port %u\n", sockaddr6.sin6_port ); ok( !sockaddr6.sin6_flowinfo, "got flowinfo %lu\n", sockaddr6.sin6_flowinfo ); - ok( len == expected_len, "got len %d\n", len );
winetest_pop_context(); }
From: Hans Leidekker hans@codeweavers.com
Also fixes test failures on Windows 11.
Wine-Bug: https://bugs.winehq.org//show_bug.cgi?id=54045 --- dlls/ntdll/rtl.c | 2 -- dlls/ntdll/tests/rtl.c | 45 +++++++++++++++++++++++------------- dlls/ws2_32/tests/protocol.c | 14 +++++------ 3 files changed, 36 insertions(+), 25 deletions(-)
diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index 59dde6359e3..84488ea1d81 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -1126,9 +1126,7 @@ static NTSTATUS ipv6_string_to_address(const WCHAR *str, BOOL ex, { if (str[1] != ':') goto error; str++; - /* Windows bug: a double colon at the beginning is treated as 4 bytes of zeros instead of 2 */ address->u.Word[0] = 0; - n_bytes = 2; }
for (;;) diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c index 1e5e8c2580c..c2ca8ea11a7 100644 --- a/dlls/ntdll/tests/rtl.c +++ b/dlls/ntdll/tests/rtl.c @@ -1409,7 +1409,7 @@ static const struct /* win_broken: XP and Vista do not handle this correctly ex_fail: Ex function does need the string to be terminated, non-Ex does not. ex_skip: test doesn't make sense for Ex (f.e. it's invalid for non-Ex but valid for Ex) */ - enum { normal_6, win_broken_6 = 1, ex_fail_6 = 2, ex_skip_6 = 4 } flags; + enum { normal_6, win_broken_6 = 1, ex_fail_6 = 2, ex_skip_6 = 4, win_extra_zero = 8 } flags; } ipv6_tests[] = { { "0000:0000:0000:0000:0000:0000:0000:0000", STATUS_SUCCESS, 39, @@ -1576,12 +1576,12 @@ static const struct { 0, 0, 0, 0, 0, 0, 0, 0 } }, { "::0:0:0:0:0:0", STATUS_SUCCESS, 13, { 0, 0, 0, 0, 0, 0, 0, 0 } }, - /* this one and the next one are incorrectly parsed by windows, + /* this one and the next one are incorrectly parsed before Windows 11, it adds one zero too many in front, cutting off the last digit. */ - { "::0:0:0:0:0:0:0", STATUS_SUCCESS, 13, - { 0, 0, 0, 0, 0, 0, 0, 0 }, ex_fail_6 }, - { "::0:a:b:c:d:e:f", STATUS_SUCCESS, 13, - { 0, 0, 0, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00 }, ex_fail_6 }, + { "::0:0:0:0:0:0:0", STATUS_SUCCESS, 15, + { 0, 0, 0, 0, 0, 0, 0, 0 }, win_broken_6|win_extra_zero }, + { "::0:a:b:c:d:e:f", STATUS_SUCCESS, 15, + { 0, 0, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00, 0xf00 }, win_broken_6|win_extra_zero }, { "::123.123.123.123", STATUS_SUCCESS, 17, { 0, 0, 0, 0, 0, 0, 0x7b7b, 0x7b7b } }, { "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", STATUS_SUCCESS, 39, @@ -2103,19 +2103,32 @@ static void test_RtlIpv6StringToAddress(void) } else { - ok(terminator == ipv6_tests[i].address + ipv6_tests[i].terminator_offset, - "[%s] terminator = %p, expected %p\n", - ipv6_tests[i].address, terminator, ipv6_tests[i].address + ipv6_tests[i].terminator_offset); + if (ipv6_tests[i].flags & win_extra_zero) + ok(terminator == ipv6_tests[i].address + ipv6_tests[i].terminator_offset || + broken(terminator != ipv6_tests[i].address + ipv6_tests[i].terminator_offset), + "[%s] terminator = %p, expected %p\n", + ipv6_tests[i].address, terminator, ipv6_tests[i].address + ipv6_tests[i].terminator_offset); + else + ok(terminator == ipv6_tests[i].address + ipv6_tests[i].terminator_offset, + "[%s] terminator = %p, expected %p\n", + ipv6_tests[i].address, terminator, ipv6_tests[i].address + ipv6_tests[i].terminator_offset); }
init_ip6(&expected_ip, ipv6_tests[i].ip); - ok(!memcmp(&ip, &expected_ip, sizeof(ip)), - "[%s] ip = %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n", - ipv6_tests[i].address, - ip.s6_words[0], ip.s6_words[1], ip.s6_words[2], ip.s6_words[3], - ip.s6_words[4], ip.s6_words[5], ip.s6_words[6], ip.s6_words[7], - expected_ip.s6_words[0], expected_ip.s6_words[1], expected_ip.s6_words[2], expected_ip.s6_words[3], - expected_ip.s6_words[4], expected_ip.s6_words[5], expected_ip.s6_words[6], expected_ip.s6_words[7]); + if (ipv6_tests[i].flags & win_extra_zero) + ok(!memcmp(&ip, &expected_ip, sizeof(ip)) || broken(memcmp(&ip, &expected_ip, sizeof(ip))), + "[%s] ip = %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n", + ipv6_tests[i].address, ip.s6_words[0], ip.s6_words[1], ip.s6_words[2], ip.s6_words[3], + ip.s6_words[4], ip.s6_words[5], ip.s6_words[6], ip.s6_words[7], + expected_ip.s6_words[0], expected_ip.s6_words[1], expected_ip.s6_words[2], expected_ip.s6_words[3], + expected_ip.s6_words[4], expected_ip.s6_words[5], expected_ip.s6_words[6], expected_ip.s6_words[7]); + else + ok(!memcmp(&ip, &expected_ip, sizeof(ip)), + "[%s] ip = %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n", + ipv6_tests[i].address, ip.s6_words[0], ip.s6_words[1], ip.s6_words[2], ip.s6_words[3], + ip.s6_words[4], ip.s6_words[5], ip.s6_words[6], ip.s6_words[7], + expected_ip.s6_words[0], expected_ip.s6_words[1], expected_ip.s6_words[2], expected_ip.s6_words[3], + expected_ip.s6_words[4], expected_ip.s6_words[5], expected_ip.s6_words[6], expected_ip.s6_words[7]); } }
diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c index 01b4c2ba71e..34c0dbb0858 100644 --- a/dlls/ws2_32/tests/protocol.c +++ b/dlls/ws2_32/tests/protocol.c @@ -1078,12 +1078,12 @@ static void test_inet_pton(void) memset(addr, 0xab, sizeof(addr)); ret = p_inet_pton(AF_INET6, ipv6_tests[i].input, addr); if (ipv6_tests[i].broken) - todo_wine_if (i == 82 || i == 83) ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); + ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); else ok(ret == ipv6_tests[i].ret, "got %d\n", ret); ok(WSAGetLastError() == 0xdeadbeef, "got error %u\n", WSAGetLastError()); if (ipv6_tests[i].broken) - todo_wine_if (i == 83) ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), + ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), "address didn't match\n"); else ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n"); @@ -1093,12 +1093,12 @@ static void test_inet_pton(void) memset(addr, 0xab, sizeof(addr)); ret = pInetPtonW(AF_INET6, inputW, addr); if (ipv6_tests[i].broken) - todo_wine ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); + ok(ret == ipv6_tests[i].ret || broken(ret == ipv6_tests[i].broken_ret), "got %d\n", ret); else ok(ret == ipv6_tests[i].ret, "got %d\n", ret); ok(WSAGetLastError() == (ret ? 0xdeadbeef : WSAEINVAL), "got error %u\n", WSAGetLastError()); if (ipv6_tests[i].broken) - todo_wine_if (i == 83) ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), + ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)) || broken(memcmp(addr, ipv6_tests[i].addr, sizeof(addr))), "address didn't match\n"); else ok(!memcmp(addr, ipv6_tests[i].addr, sizeof(addr)), "address didn't match\n"); @@ -1561,11 +1561,11 @@ static void test_WSAStringToAddress(void)
if (ipv6_tests[j].broken) { - todo_wine ok( ret == (ipv6_tests[j].error ? SOCKET_ERROR : 0) || + ok( ret == (ipv6_tests[j].error ? SOCKET_ERROR : 0) || broken(ret == (ipv6_tests[j].broken_error ? SOCKET_ERROR : 0)), "got %d\n", ret ); - todo_wine ok( WSAGetLastError() == ipv6_tests[j].error || + ok( WSAGetLastError() == ipv6_tests[j].error || broken(WSAGetLastError() == ipv6_tests[j].broken_error), "got error %d\n", WSAGetLastError() ); - todo_wine ok( !memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) ) || + ok( !memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) ) || broken(memcmp( &sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr) )), "got addr %x:%x:%x:%x:%x:%x:%x:%x\n", sockaddr6.sin6_addr.s6_words[0], sockaddr6.sin6_addr.s6_words[1],
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=128302
Your paranoid android.
=== debian11 (32 bit report) ===
urlmon: uri.c:7889: Test failed: Error: CreateUri returned 0x00000000, expected 0x80070057 on invalid_uri_tests[13].
v2: Fix ws2_32 failures as well.