From 67c6df6153b7b6dceb2b569daf683a498b2fc13c Mon Sep 17 00:00:00 2001 From: Guo-wei Shieh Date: Tue, 24 Nov 2015 11:59:18 -0800 Subject: [PATCH] GetDefaultLocalAddress should return false when the address is invalid BUG= R=pthatcher@webrtc.org Review URL: https://codereview.webrtc.org/1471203002 . Cr-Commit-Position: refs/heads/master@{#10779} --- webrtc/base/network.cc | 4 ++-- webrtc/base/network_unittest.cc | 19 ++++++++++++++++++- webrtc/p2p/base/stunport.cc | 4 +++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc index f35dcbacf8..678541d0b1 100644 --- a/webrtc/base/network.cc +++ b/webrtc/base/network.cc @@ -345,10 +345,10 @@ void NetworkManagerBase::set_default_local_addresses(const IPAddress& ipv4, bool NetworkManagerBase::GetDefaultLocalAddress(int family, IPAddress* ipaddr) const { - if (family == AF_INET) { + if (family == AF_INET && !default_local_ipv4_address_.IsNil()) { *ipaddr = default_local_ipv4_address_; return true; - } else if (family == AF_INET6) { + } else if (family == AF_INET6 && !default_local_ipv6_address_.IsNil()) { *ipaddr = default_local_ipv6_address_; return true; } diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc index 5324e86e2c..cfba62b306 100644 --- a/webrtc/base/network_unittest.cc +++ b/webrtc/base/network_unittest.cc @@ -100,6 +100,7 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> { class TestBasicNetworkManager : public BasicNetworkManager { public: using BasicNetworkManager::QueryDefaultLocalAddress; + using BasicNetworkManager::set_default_local_addresses; }; // Test that the Network ctor works properly. @@ -848,9 +849,17 @@ TEST_F(NetworkTest, TestNetworkMonitoring) { NetworkMonitorFactory::ReleaseFactory(factory); } -TEST_F(NetworkTest, DefaultPrivateAddress) { +TEST_F(NetworkTest, DefaultLocalAddress) { TestBasicNetworkManager manager; manager.StartUpdating(); + IPAddress ip; + + // GetDefaultLocalAddress should return false when not set. + EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET, &ip)); + EXPECT_FALSE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); + + // Make sure we can query default local address when an address for such + // address family exists. std::vector networks; manager.GetNetworks(&networks); for (auto& network : networks) { @@ -860,6 +869,14 @@ TEST_F(NetworkTest, DefaultPrivateAddress) { EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress()); } } + + // GetDefaultLocalAddress should return the valid default address after set. + manager.set_default_local_addresses(GetLoopbackIP(AF_INET), + GetLoopbackIP(AF_INET6)); + EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip)); + EXPECT_EQ(ip, GetLoopbackIP(AF_INET)); + EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); + EXPECT_EQ(ip, GetLoopbackIP(AF_INET6)); manager.StopUpdating(); } diff --git a/webrtc/p2p/base/stunport.cc b/webrtc/p2p/base/stunport.cc index 13ecca4a3a..0ae3f60a8a 100644 --- a/webrtc/p2p/base/stunport.cc +++ b/webrtc/p2p/base/stunport.cc @@ -416,10 +416,12 @@ bool UDPPort::MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const { bool result = Network()->default_local_address_provider()->GetDefaultLocalAddress( addr->family(), &default_address); - if (!result || default_address.IsNil()) { + if (!result) { return false; } + RTC_DCHECK(!default_address.IsNil()) + addr->SetIP(default_address); return true; }