diff --git a/webrtc/base/win32.cc b/webrtc/base/win32.cc index 8f5661225..c1b55bf63 100644 --- a/webrtc/base/win32.cc +++ b/webrtc/base/win32.cc @@ -86,7 +86,7 @@ const char* inet_ntop_v6(const void* src, char* dst, socklen_t size) { reinterpret_cast(src); int runpos[8]; int current = 1; - int max = 1; + int max = 0; int maxpos = -1; int run_array_size = ARRAY_SIZE(runpos); // Run over the address marking runs of 0s. @@ -100,11 +100,11 @@ const char* inet_ntop_v6(const void* src, char* dst, socklen_t size) { ++current; } else { runpos[i] = -1; - current =1; + current = 1; } } - if (max > 1) { + if (max > 0) { int tmpmax = maxpos; // Run back through, setting -1 for all but the longest run. for (int i = run_array_size - 1; i >= 0; i--) { diff --git a/webrtc/base/win32_unittest.cc b/webrtc/base/win32_unittest.cc index 0050c7726..2bd93acc1 100644 --- a/webrtc/base/win32_unittest.cc +++ b/webrtc/base/win32_unittest.cc @@ -59,4 +59,37 @@ TEST_F(Win32Test, WinPingTest) { IPAddress(INADDR_LOOPBACK), 20, 50, 0, false)); } +TEST_F(Win32Test, IPv6AddressCompression) { + IPAddress ipv6; + + // Zero compression should be done on the leftmost 0s when there are + // multiple longest series. + ASSERT_TRUE(IPFromString("2a00:8a00:a000:1190:0000:0001:000:252", &ipv6)); + EXPECT_EQ("2a00:8a00:a000:1190::1:0:252", ipv6.ToString()); + + // Ensure the zero compression could handle multiple octects. + ASSERT_TRUE(IPFromString("0:0:0:0:0:0:0:1", &ipv6)); + EXPECT_EQ("::1", ipv6.ToString()); + + // Make sure multiple 0 octects compressed. + ASSERT_TRUE(IPFromString("fe80:0:0:0:2aa:ff:fe9a:4ca2", &ipv6)); + EXPECT_EQ("fe80::2aa:ff:fe9a:4ca2", ipv6.ToString()); + + // Test zero compression at the end of string. + ASSERT_TRUE(IPFromString("2a00:8a00:a000:1190:0000:0001:000:00", &ipv6)); + EXPECT_EQ("2a00:8a00:a000:1190:0:1::", ipv6.ToString()); + + // Test zero compression at the beginning of string. + ASSERT_TRUE(IPFromString("0:0:000:1190:0000:0001:000:00", &ipv6)); + EXPECT_EQ("::1190:0:1:0:0", ipv6.ToString()); + + // Test zero compression only done once. + ASSERT_TRUE(IPFromString("0:1:000:1190:0000:0001:000:01", &ipv6)); + EXPECT_EQ("::1:0:1190:0:1:0:1", ipv6.ToString()); + + // Make sure noncompressable IPv6 is the same. + ASSERT_TRUE(IPFromString("1234:5678:abcd:1234:5678:abcd:1234:5678", &ipv6)); + EXPECT_EQ("1234:5678:abcd:1234:5678:abcd:1234:5678", ipv6.ToString()); +} + } // namespace rtc