diff --git a/talk/base/socketaddress.cc b/talk/base/socketaddress.cc index 792d414adc..31e268c053 100644 --- a/talk/base/socketaddress.cc +++ b/talk/base/socketaddress.cc @@ -244,25 +244,20 @@ bool SocketAddress::operator==(const SocketAddress& addr) const { } bool SocketAddress::operator<(const SocketAddress& addr) const { - if (ip_ < addr.ip_) - return true; - else if (addr.ip_ < ip_) - return false; + if (ip_ != addr.ip_) + return ip_ < addr.ip_; - // We only check hostnames if both IPs are zero. This matches EqualIPs() - if (addr.IsAnyIP()) { - if (hostname_ < addr.hostname_) - return true; - else if (addr.hostname_ < hostname_) - return false; - } + // We only check hostnames if both IPs are ANY or unspecified. This matches + // EqualIPs(). + if ((IPIsAny(ip_) || IPIsUnspec(ip_)) && hostname_ != addr.hostname_) + return hostname_ < addr.hostname_; return port_ < addr.port_; } bool SocketAddress::EqualIPs(const SocketAddress& addr) const { return (ip_ == addr.ip_) && - ((!IPIsAny(ip_)) || (hostname_ == addr.hostname_)); + ((!IPIsAny(ip_) && !IPIsUnspec(ip_)) || (hostname_ == addr.hostname_)); } bool SocketAddress::EqualPorts(const SocketAddress& addr) const { diff --git a/talk/base/socketaddress_unittest.cc b/talk/base/socketaddress_unittest.cc index c57db8d5a0..b720e955c6 100644 --- a/talk/base/socketaddress_unittest.cc +++ b/talk/base/socketaddress_unittest.cc @@ -290,10 +290,18 @@ TEST(SocketAddressTest, TestEqualityOperators) { addr2 = SocketAddress("fe80::1", 5678); EXPECT_PRED2(AreUnequal, addr1, addr2); + + SocketAddress addr3("a.b.c.d", 1); + SocketAddress addr4("b.b.c.d", 1); + EXPECT_PRED2(AreUnequal, addr3, addr4); + EXPECT_PRED2(AreEqual, addr3, addr3); + + addr3.SetIP(addr1.ip()); + addr4.SetIP(addr1.ip()); + EXPECT_PRED2(AreEqual,addr3, addr4); } -bool IsLessThan(const SocketAddress& addr1, - const SocketAddress& addr2) { +bool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) { return addr1 < addr2 && !(addr2 < addr1) && !(addr1 == addr2); @@ -324,6 +332,10 @@ TEST(SocketAddressTest, TestComparisonOperator) { addr2 = SocketAddress("fe80::1", 5678); EXPECT_FALSE(addr1 < addr2); EXPECT_FALSE(addr2 < addr1); + + SocketAddress addr3("a.b.c.d", 1); + SocketAddress addr4("b.b.c.d", 1); + EXPECT_PRED2(IsLessThan, addr3, addr4); } TEST(SocketAddressTest, TestToSensitiveString) {