Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(735)

Unified Diff: net/dns/host_resolver_impl.cc

Issue 14208010: [net/dns] Add test DualFamilyLocalhost and fix it when DnsClient enabled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test only IPv4 loopback Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/dns/host_resolver_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « no previous file | net/dns/host_resolver_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698