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}
This commit is contained in:
Guo-wei Shieh
2015-11-24 11:59:18 -08:00
parent 7d842d660e
commit 67c6df6153
3 changed files with 23 additions and 4 deletions

View File

@ -345,10 +345,10 @@ void NetworkManagerBase::set_default_local_addresses(const IPAddress& ipv4,
bool NetworkManagerBase::GetDefaultLocalAddress(int family, bool NetworkManagerBase::GetDefaultLocalAddress(int family,
IPAddress* ipaddr) const { IPAddress* ipaddr) const {
if (family == AF_INET) { if (family == AF_INET && !default_local_ipv4_address_.IsNil()) {
*ipaddr = default_local_ipv4_address_; *ipaddr = default_local_ipv4_address_;
return true; return true;
} else if (family == AF_INET6) { } else if (family == AF_INET6 && !default_local_ipv6_address_.IsNil()) {
*ipaddr = default_local_ipv6_address_; *ipaddr = default_local_ipv6_address_;
return true; return true;
} }

View File

@ -100,6 +100,7 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> {
class TestBasicNetworkManager : public BasicNetworkManager { class TestBasicNetworkManager : public BasicNetworkManager {
public: public:
using BasicNetworkManager::QueryDefaultLocalAddress; using BasicNetworkManager::QueryDefaultLocalAddress;
using BasicNetworkManager::set_default_local_addresses;
}; };
// Test that the Network ctor works properly. // Test that the Network ctor works properly.
@ -848,9 +849,17 @@ TEST_F(NetworkTest, TestNetworkMonitoring) {
NetworkMonitorFactory::ReleaseFactory(factory); NetworkMonitorFactory::ReleaseFactory(factory);
} }
TEST_F(NetworkTest, DefaultPrivateAddress) { TEST_F(NetworkTest, DefaultLocalAddress) {
TestBasicNetworkManager manager; TestBasicNetworkManager manager;
manager.StartUpdating(); 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<Network*> networks; std::vector<Network*> networks;
manager.GetNetworks(&networks); manager.GetNetworks(&networks);
for (auto& network : networks) { for (auto& network : networks) {
@ -860,6 +869,14 @@ TEST_F(NetworkTest, DefaultPrivateAddress) {
EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress()); 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(); manager.StopUpdating();
} }

View File

@ -416,10 +416,12 @@ bool UDPPort::MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const {
bool result = bool result =
Network()->default_local_address_provider()->GetDefaultLocalAddress( Network()->default_local_address_provider()->GetDefaultLocalAddress(
addr->family(), &default_address); addr->family(), &default_address);
if (!result || default_address.IsNil()) { if (!result) {
return false; return false;
} }
RTC_DCHECK(!default_address.IsNil())
addr->SetIP(default_address); addr->SetIP(default_address);
return true; return true;
} }