Index: net/dns/host_resolver_impl.cc |
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc |
index 74a76755ce4ebe5c1eaae88a8ac1b21ff9a555a2..d9c43dfadd728fe6daa8ac7b77c855e22ba39285 100644 |
--- a/net/dns/host_resolver_impl.cc |
+++ b/net/dns/host_resolver_impl.cc |
@@ -250,6 +250,25 @@ AddressList EnsurePortOnAddressList(const AddressList& list, uint16 port) { |
return AddressList::CopyWithPort(list, port); |
} |
+// Returns true if |addresses| contains only IPv4 loopback addresses. |
+bool IsAllIPv4Loopback(const AddressList& addresses) { |
+ for (unsigned i = 0; i < addresses.size(); ++i) { |
+ const IPAddressNumber& address = addresses[i].address(); |
+ switch (addresses[i].GetFamily()) { |
+ case ADDRESS_FAMILY_IPV4: |
+ if (address[0] != 127) |
+ return false; |
+ break; |
+ case ADDRESS_FAMILY_IPV6: |
+ return false; |
+ default: |
+ NOTREACHED(); |
+ return false; |
+ } |
+ } |
+ return true; |
+} |
+ |
// Creates NetLog parameters when the resolve failed. |
base::Value* NetLogProcTaskFailedCallback(uint32 attempt_number, |
int net_error, |
@@ -1950,7 +1969,6 @@ bool HostResolverImpl::ServeFromHosts(const Key& key, |
DCHECK(addresses); |
if (!HaveDnsConfig()) |
return false; |
- |
addresses->clear(); |
// HOSTS lookups are case-insensitive. |
@@ -1979,6 +1997,17 @@ bool HostResolverImpl::ServeFromHosts(const Key& key, |
addresses->push_back(IPEndPoint(it->second, info.port())); |
} |
+ // If got only loopback addresses and the family was restricted, resolve |
+ // again, without restrictions. See SystemHostResolverCall for rationale. |
+ if ((key.host_resolver_flags & |
+ HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6) && |
+ IsAllIPv4Loopback(*addresses)) { |
+ Key new_key(key); |
+ new_key.address_family = ADDRESS_FAMILY_UNSPECIFIED; |
+ new_key.host_resolver_flags &= |
+ ~HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
+ return ServeFromHosts(new_key, info, addresses); |
+ } |
return !addresses->empty(); |
} |
@@ -2118,6 +2147,7 @@ void HostResolverImpl::OnIPAddressChanged() { |
void HostResolverImpl::OnDNSChanged() { |
DnsConfig dns_config; |
NetworkChangeNotifier::GetDnsConfig(&dns_config); |
+ |
if (net_log_) { |
net_log_->AddGlobalEntry( |
NetLog::TYPE_DNS_CONFIG_CHANGED, |