diff --git a/debian/changelog b/debian/changelog index 849ed323..74b7931a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,6 +1,7 @@ wine-staging (1.7.41) UNRELEASED; urgency=low * Disable DXVA2 controls in winecfg when support is not compiled in. * Added patch to enable/disable EAX support via winecfg. + * Added tests for RtlIpv6AddressToString and RtlIpv6AddressToStringEx. * Partially remove advapi32-Revert_DACL patches. -- Sebastian Lackner Sun, 05 Apr 2015 03:11:58 +0200 diff --git a/patches/ntdll-RtlIpStringToAddress/0004-ntdll-tests-Add-tests-for-RtlIpv6AddressToString-and.patch b/patches/ntdll-RtlIpStringToAddress/0004-ntdll-tests-Add-tests-for-RtlIpv6AddressToString-and.patch new file mode 100644 index 00000000..cca2187f --- /dev/null +++ b/patches/ntdll-RtlIpStringToAddress/0004-ntdll-tests-Add-tests-for-RtlIpv6AddressToString-and.patch @@ -0,0 +1,291 @@ +From 569439573a4b64588331359269f90a32f0d93b9c Mon Sep 17 00:00:00 2001 +From: Mark Jansen +Date: Mon, 6 Apr 2015 00:48:33 +0200 +Subject: ntdll/tests: Add tests for RtlIpv6AddressToString and + RtlIpv6AddressToStringEx. + +--- + dlls/ntdll/tests/rtl.c | 246 +++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 246 insertions(+) + +diff --git a/dlls/ntdll/tests/rtl.c b/dlls/ntdll/tests/rtl.c +index 6d41589..37f74b5 100644 +--- a/dlls/ntdll/tests/rtl.c ++++ b/dlls/ntdll/tests/rtl.c +@@ -91,6 +91,8 @@ static CHAR * (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR); + static NTSTATUS (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG); + static NTSTATUS (WINAPI *pRtlIpv4StringToAddressA)(PCSTR, BOOLEAN, PCSTR *, IN_ADDR *); + static NTSTATUS (WINAPI *pRtlIpv4StringToAddressExA)(PCSTR, BOOLEAN, IN_ADDR *, PUSHORT); ++static CHAR * (WINAPI *pRtlIpv6AddressToStringA)(struct in6_addr *, PSTR); ++static NTSTATUS (WINAPI *pRtlIpv6AddressToStringExA)(struct in6_addr *, ULONG, USHORT, PCHAR, PULONG); + static NTSTATUS (WINAPI *pRtlIpv6StringToAddressA)(PCSTR, PCSTR *, struct in6_addr *); + static NTSTATUS (WINAPI *pRtlIpv6StringToAddressW)(PCWSTR, PCWSTR *, struct in6_addr *); + static NTSTATUS (WINAPI *pRtlIpv6StringToAddressExA)(PCSTR, struct in6_addr *, PULONG, PUSHORT); +@@ -148,6 +150,8 @@ static void InitFunctionPtrs(void) + pRtlIpv4AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringExA"); + pRtlIpv4StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressA"); + pRtlIpv4StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv4StringToAddressExA"); ++ pRtlIpv6AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringA"); ++ pRtlIpv6AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv6AddressToStringExA"); + pRtlIpv6StringToAddressA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressA"); + pRtlIpv6StringToAddressW = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressW"); + pRtlIpv6StringToAddressExA = (void *)GetProcAddress(hntdll, "RtlIpv6StringToAddressExA"); +@@ -1924,6 +1928,246 @@ static void init_ip6(IN6_ADDR* addr, const int src[8]) + } + } + ++static void test_RtlIpv6AddressToString(void) ++{ ++ CHAR buffer[50]; ++ LPCSTR result; ++ IN6_ADDR ip; ++ DWORD_PTR len; ++ struct ++ { ++ PCSTR address; ++ int ip[8]; ++ } tests[] = ++ { ++ /* ipv4 addresses & ISATAP addresses */ ++ { "::13.1.68.3", { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "::ffff:13.1.68.3", { 0, 0, 0, 0, 0, 0xffff, 0x10d, 0x344 } }, ++ { "::feff:d01:4403", { 0, 0, 0, 0, 0, 0xfffe, 0x10d, 0x344 } }, ++ { "::fffe:d01:4403", { 0, 0, 0, 0, 0, 0xfeff, 0x10d, 0x344 } }, ++ { "::100:d01:4403", { 0, 0, 0, 0, 0, 1, 0x10d, 0x344 } }, ++ { "::1:d01:4403", { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "::ffff:0:4403", { 0, 0, 0, 0, 0, 0xffff, 0, 0x344 } }, ++ { "::ffff:13.1.0.0", { 0, 0, 0, 0, 0, 0xffff, 0x10d, 0 } }, ++ { "::ffff:0:0", { 0, 0, 0, 0, 0, 0xffff, 0, 0 } }, ++ { "::ffff:0:13.1.68.3", { 0, 0, 0, 0, 0xffff, 0, 0x10d, 0x344 } }, ++ { "::ffff:ffff:d01:4403", { 0, 0, 0, 0, 0xffff, 0xffff, 0x10d, 0x344 } }, ++ { "::ffff:0:0:d01:4403", { 0, 0, 0, 0xffff, 0, 0, 0x10d, 0x344 } }, ++ { "::ffff:255.255.255.255", { 0, 0, 0, 0, 0, 0xffff, 0xffff, 0xffff } }, ++ { "::ffff:129.144.52.38", { 0, 0, 0, 0, 0, 0xffff, 0x9081, 0x2634 } }, ++ { "::5efe:129.144.52.38", { 0, 0, 0, 0, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111:2222:3333:4444:0:5efe:129.144.52.38", { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111:2222:3333::5efe:129.144.52.38", { 0x1111, 0x2222, 0x3333, 0, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111:2222::5efe:129.144.52.38", { 0x1111, 0x2222, 0, 0, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111::5efe:129.144.52.38", { 0x1111, 0, 0, 0, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "::200:5efe:129.144.52.38", { 0, 0, 0, 0, 2, 0xfe5e, 0x9081, 0x2634 } }, ++ { "::100:5efe:8190:3426", { 0, 0, 0, 0, 1, 0xfe5e, 0x9081, 0x2634 } }, ++ /* 'normal' addresses */ ++ { "::1", { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "0:1:2:3:4:5:6:7", { 0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700 } }, ++ { "1080::8:800:200c:417a", { 0x8010, 0, 0, 0, 0x800, 0x8, 0x0c20, 0x7a41 } }, ++ { "1111:2222:3333:4444:5555:6666:7b7b:7b7b", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111:2222:3333:4444:5555:6666:7777:8888", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888 } }, ++ { "1111:2222:3333:4444:5555:6666::", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0, 0 } }, ++ { "1111:2222:3333:4444:5555:6666:0:8888", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0, 0x8888 } }, ++ { "1111:2222:3333:4444:5555::", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0, 0, 0 } }, ++ { "1111:2222:3333:4444:5555:0:7b7b:7b7b", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0, 0x7b7b, 0x7b7b } }, ++ { "1111:2222:3333:4444:5555:0:7777:8888", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0, 0x7777, 0x8888 } }, ++ { "1111:2222:3333:4444:5555::8888", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0, 0, 0x8888 } }, ++ { "1111::", { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "1111::7b7b:7b7b", { 0x1111, 0, 0, 0, 0, 0, 0x7b7b, 0x7b7b } }, ++ { "1111:0:3333:4444:5555:6666:7b7b:7b7b", { 0x1111, 0, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111:0:3333:4444:5555:6666:7777:8888", { 0x1111, 0, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888 } }, ++ { "1111::4444:5555:6666:7b7b:7b7b", { 0x1111, 0, 0, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111::4444:5555:6666:7777:8888", { 0x1111, 0, 0, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888 } }, ++ { "1111::5555:6666:7b7b:7b7b", { 0x1111, 0, 0, 0, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111::5555:6666:7777:8888", { 0x1111, 0, 0, 0, 0x5555, 0x6666, 0x7777, 0x8888 } }, ++ { "1111::6666:7b7b:7b7b", { 0x1111, 0, 0, 0, 0, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111::6666:7777:8888", { 0x1111, 0, 0, 0, 0, 0x6666, 0x7777, 0x8888 } }, ++ { "1111::7777:8888", { 0x1111, 0, 0, 0, 0, 0, 0x7777, 0x8888 } }, ++ { "1111::8888", { 0x1111, 0, 0, 0, 0, 0, 0, 0x8888 } }, ++ { "1:2:3:4:5:6:102:304", { 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x201, 0x403 } }, ++ { "1:2:3:4:5:6:7:8", { 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700, 0x800 } }, ++ { "1:2:3:4:5:6::", { 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0, 0 } }, ++ { "1:2:3:4:5:6:0:8", { 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0, 0x800 } }, ++ { "2001:0:1234::c1c0:abcd:876", { 0x120, 0, 0x3412, 0, 0, 0xc0c1, 0xcdab, 0x7608 } }, ++ { "2001:0:4136:e378:8000:63bf:3fff:fdd2", { 0x120, 0, 0x3641, 0x78e3, 0x80, 0xbf63, 0xff3f, 0xd2fd } }, ++ { "2001:db8::1428:57ab", { 0x120, 0xb80d, 0, 0, 0, 0, 0x2814, 0xab57 } }, ++ { "2001:db8:1234:ffff:ffff:ffff:ffff:ffff", { 0x120, 0xb80d, 0x3412, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff } }, ++ { "2001:0:ce49:7601:2cad:dfff:7c94:fffe", { 0x120, 0, 0x49ce, 0x176, 0xad2c, 0xffdf, 0x947c, 0xfeff } }, ++ { "2001:db8:85a3::8a2e:370:7334", { 0x120, 0xb80d, 0xa385, 0, 0, 0x2e8a, 0x7003, 0x3473 } }, ++ { "3ffe:b00::1:0:0:a", { 0xfe3f, 0xb, 0, 0, 0x100, 0, 0, 0xa00 } }, ++ { "::a:b:c:d:e", { 0, 0, 0, 0xa00, 0xb00, 0xc00, 0xd00, 0xe00 } }, ++ { "::123.123.123.123", { 0, 0, 0, 0, 0, 0, 0x7b7b, 0x7b7b } }, ++ { "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", { 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff } }, ++ { "1111:2222:3333:4444:5555:6666:7777:1", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x100 } }, ++ { "1111:2222:3333:4444:5555:6666:7777:8888", { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777, 0x8888 } }, ++ { "1111:2222::", { 0x1111, 0x2222, 0, 0, 0, 0, 0, 0 } }, ++ { "1111::3333:4444:5555:6666:7777", { 0x1111, 0, 0, 0x3333, 0x4444, 0x5555, 0x6666, 0x7777 } }, ++ { "1111:2222::", { 0x1111, 0x2222, 0, 0, 0, 0, 0, 0 } }, ++ { "1111::3333", { 0x1111, 0, 0, 0, 0, 0, 0, 0x3333 } }, ++ { "2001:0:1234::c1c0:abcd:876", { 0x120, 0, 0x3412, 0, 0, 0xc0c1, 0xcdab, 0x7608 } }, ++ { "2001::ffd3", { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ }; ++ const size_t testcount = sizeof(tests) / sizeof(tests[0]); ++ unsigned int i; ++ ++ if (!pRtlIpv6AddressToStringA) ++ { ++ skip("RtlIpv6AddressToStringA not available\n"); ++ return; ++ } ++ ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ memset(&ip, 0, sizeof(ip)); ++ result = pRtlIpv6AddressToStringA(&ip, buffer); ++ ++ len = strlen(buffer); ++ ok(result == (buffer + len) && !strcmp(buffer, "::"), ++ "got %p with '%s' (expected %p with '::')\n", result, buffer, buffer + len); ++ ++ result = pRtlIpv6AddressToStringA(&ip, NULL); ++ ok(result == (LPCSTR)~0 || broken(result == (LPCSTR)len) /* WinXP / Win2k3 */, ++ "got %p, expected %p\n", result, (LPCSTR)~0); ++ ++ for (i = 0; i < testcount; i++) ++ { ++ init_ip6(&ip, tests[i].ip); ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ ++ result = pRtlIpv6AddressToStringA(&ip, buffer); ++ len = strlen(buffer); ++ ok(result == (buffer + len) && !strcmp(buffer, tests[i].address), ++ "got %p with '%s' (expected %p with '%s')\n", result, buffer, buffer + len, tests[i].address); ++ ++ ok(buffer[45] == 0 || broken(buffer[45] != 0) /* WinXP / Win2k3 */, ++ "expected data at buffer[45] to always be NULL\n"); ++ ok(buffer[46] == '#', "expected data at buffer[46] not to change\n"); ++ } ++} ++ ++static void test_RtlIpv6AddressToStringEx(void) ++{ ++ CHAR buffer[70]; ++ NTSTATUS res; ++ IN6_ADDR ip; ++ ULONG len; ++ struct ++ { ++ PCSTR address; ++ ULONG scopeid; ++ USHORT port; ++ int ip[8]; ++ } tests[] = ++ { ++ /* ipv4 addresses & ISATAP addresses */ ++ { "::13.1.68.3", 0, 0, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "::13.1.68.3%1", 1, 0, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "::13.1.68.3%4294949819", 0xffffbbbb, 0, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "[::13.1.68.3%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "[::13.1.68.3%4294949819]:256", 0xffffbbbb, 1, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ { "[::13.1.68.3]:256", 0, 1, { 0, 0, 0, 0, 0, 0, 0x10d, 0x344 } }, ++ ++ { "::1:d01:4403", 0, 0, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "::1:d01:4403%1", 1, 0, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "::1:d01:4403%4294949819", 0xffffbbbb, 0, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "[::1:d01:4403%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "[::1:d01:4403%4294949819]:256", 0xffffbbbb, 1, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ { "[::1:d01:4403]:256", 0, 1, { 0, 0, 0, 0, 0, 0x100, 0x10d, 0x344 } }, ++ ++ { "1111:2222:3333:4444:0:5efe:129.144.52.38", 0, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111:2222:3333:4444:0:5efe:129.144.52.38%1", 1, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "1111:2222:3333:4444:0:5efe:129.144.52.38%4294949819", 0xffffbbbb, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "[1111:2222:3333:4444:0:5efe:129.144.52.38%4294949819]:65518",0xffffbbbb, 0xeeff, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "[1111:2222:3333:4444:0:5efe:129.144.52.38%4294949819]:256", 0xffffbbbb, 1, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ { "[1111:2222:3333:4444:0:5efe:129.144.52.38]:256", 0, 1, { 0x1111, 0x2222, 0x3333, 0x4444, 0, 0xfe5e, 0x9081, 0x2634 } }, ++ ++ { "::1", 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "::1%1", 1, 0, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "::1%4294949819", 0xffffbbbb, 0, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "[::1%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "[::1%4294949819]:256", 0xffffbbbb, 1, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ { "[::1]:256", 0, 1, { 0, 0, 0, 0, 0, 0, 0, 0x100 } }, ++ ++ { "1111:2222:3333:4444:5555:6666:7b7b:7b7b", 0, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111:2222:3333:4444:5555:6666:7b7b:7b7b%1", 1, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "1111:2222:3333:4444:5555:6666:7b7b:7b7b%4294949819", 0xffffbbbb, 0, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "[1111:2222:3333:4444:5555:6666:7b7b:7b7b%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "[1111:2222:3333:4444:5555:6666:7b7b:7b7b%4294949819]:256", 0xffffbbbb, 1, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ { "[1111:2222:3333:4444:5555:6666:7b7b:7b7b]:256", 0, 1, { 0x1111, 0x2222, 0x3333, 0x4444, 0x5555, 0x6666, 0x7b7b, 0x7b7b } }, ++ ++ { "1111::", 0, 0, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "1111::%1", 1, 0, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "1111::%4294949819", 0xffffbbbb, 0, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "[1111::%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "[1111::%4294949819]:256", 0xffffbbbb, 1, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ { "[1111::]:256", 0, 1, { 0x1111, 0, 0, 0, 0, 0, 0, 0 } }, ++ ++ { "2001::ffd3", 0, 0, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ { "2001::ffd3%1", 1, 0, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ { "2001::ffd3%4294949819", 0xffffbbbb, 0, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ { "[2001::ffd3%4294949819]:65518", 0xffffbbbb, 0xeeff, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ { "[2001::ffd3%4294949819]:256", 0xffffbbbb, 1, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ { "[2001::ffd3]:256", 0, 1, { 0x120, 0, 0, 0, 0, 0, 0, 0xd3ff } }, ++ }; ++ const size_t testcount = sizeof(tests) / sizeof(tests[0]); ++ unsigned int i; ++ ++ if (!pRtlIpv6AddressToStringExA) ++ { ++ skip("RtlIpv6AddressToStringExA not available\n"); ++ return; ++ } ++ ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ memset(&ip, 0, sizeof(ip)); ++ len = sizeof(buffer); ++ res = pRtlIpv6AddressToStringExA(&ip, 0, 0, buffer, &len); ++ ++ ok(res == STATUS_SUCCESS, "[validate] res = 0x%08x, expected STATUS_SUCCESS\n", res); ++ ok(len == 3 && !strcmp(buffer, "::"), ++ "got len %d with '%s' (expected 3 with '::')\n", len, buffer); ++ ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ ++ len = sizeof(buffer); ++ res = pRtlIpv6AddressToStringExA(NULL, 0, 0, buffer, &len); ++ ok(res == STATUS_INVALID_PARAMETER, "[null ip] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res); ++ ++ len = sizeof(buffer); ++ res = pRtlIpv6AddressToStringExA(&ip, 0, 0, NULL, &len); ++ ok(res == STATUS_INVALID_PARAMETER, "[null buffer] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res); ++ ++ res = pRtlIpv6AddressToStringExA(&ip, 0, 0, buffer, NULL); ++ ok(res == STATUS_INVALID_PARAMETER, "[null length] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res); ++ ++ len = 2; ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ res = pRtlIpv6AddressToStringExA(&ip, 0, 0, buffer, &len); ++ ok(res == STATUS_INVALID_PARAMETER, "[null length] res = 0x%08x, expected STATUS_INVALID_PARAMETER\n", res); ++ ok(buffer[0] == '#', "got first char %c (expected '#')\n", buffer[0]); ++ ok(len == 3, "got len %d (expected len 3)\n", len); ++ ++ for (i = 0; i < testcount; i++) ++ { ++ init_ip6(&ip, tests[i].ip); ++ len = sizeof(buffer); ++ memset(buffer, '#', sizeof(buffer)); ++ buffer[sizeof(buffer)-1] = 0; ++ ++ res = pRtlIpv6AddressToStringExA(&ip, tests[i].scopeid, tests[i].port, buffer, &len); ++ ++ ok(res == STATUS_SUCCESS, "[validate] res = 0x%08x, expected STATUS_SUCCESS\n", res); ++ ok(len == (strlen(tests[i].address) + 1) && !strcmp(buffer, tests[i].address), ++ "got len %d with '%s' (expected %d with '%s')\n", len, buffer, strlen(tests[i].address), tests[i].address); ++ } ++} ++ + static void compare_RtlIpv6StringToAddressW(PCSTR name_a, int terminator_offset_a, + const struct in6_addr *addr_a, NTSTATUS res_a) + { +@@ -3173,6 +3417,8 @@ START_TEST(rtl) + test_RtlIpv4AddressToStringEx(); + test_RtlIpv4StringToAddress(); + test_RtlIpv4StringToAddressEx(); ++ test_RtlIpv6AddressToString(); ++ test_RtlIpv6AddressToStringEx(); + test_RtlIpv6StringToAddress(); + test_RtlIpv6StringToAddressEx(); + test_LdrAddRefDll(); +-- +2.3.5 + diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 54d52548..7622e408 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -3388,10 +3388,12 @@ if test "$enable_ntdll_RtlIpStringToAddress" -eq 1; then patch_apply ntdll-RtlIpStringToAddress/0001-ntdll-tests-Tests-for-RtlIpv6StringToAddress-try-6.patch patch_apply ntdll-RtlIpStringToAddress/0002-ntdll-tests-Tests-for-RtlIpv6StringToAddressEx-try-6.patch patch_apply ntdll-RtlIpStringToAddress/0003-ntdll-tests-Tests-for-RtlIpv4StringToAddressEx-try-5.patch + patch_apply ntdll-RtlIpStringToAddress/0004-ntdll-tests-Add-tests-for-RtlIpv6AddressToString-and.patch ( echo '+ { "Mark Jansen", "ntdll/tests: Tests for RtlIpv6StringToAddress.", 6 },'; echo '+ { "Mark Jansen", "ntdll/tests: Tests for RtlIpv6StringToAddressEx.", 6 },'; echo '+ { "Mark Jansen", "ntdll/tests: Tests for RtlIpv4StringToAddressEx (try 5, resend).", 1 },'; + echo '+ { "Mark Jansen", "ntdll/tests: Add tests for RtlIpv6AddressToString and RtlIpv6AddressToStringEx.", 1 },'; ) >> "$patchlist" fi