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

Unified Diff: net/dns/host_resolver_impl.cc

Issue 1177933002: Resolve RFC 6761 localhost names to loopback (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: style tweaks, simplification Created 5 years, 6 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
Index: net/dns/host_resolver_impl.cc
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 970ec1f457ade5ba90b1b2ac6224f57e782c0271..4639737d662db475bfc1bed201c311f0ab930b64 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -74,8 +74,6 @@ const unsigned kNegativeCacheEntryTTLSeconds = 0;
// Minimum TTL for successful resolutions with DnsTask.
const unsigned kMinimumTTLSeconds = kCacheEntryTTLSeconds;
-const char kLocalhost[] = "localhost.";
-
// Time between IPv6 probes, i.e. for how long results of each IPv6 probe are
// cached.
const int kIPv6ProbePeriodMs = 1000;
@@ -1318,13 +1316,7 @@ class HostResolverImpl::Job : public PrioritizedDispatcher::Job,
}
void AddRequest(scoped_ptr<Request> req) {
- // .localhost queries are redirected to "localhost." to make sure
- // that they are never sent out on the network, per RFC 6761.
- if (IsLocalhostTLD(req->info().hostname())) {
- DCHECK_EQ(key_.hostname, kLocalhost);
- } else {
- DCHECK_EQ(key_.hostname, req->info().hostname());
- }
+ DCHECK_EQ(key_.hostname, req->info().hostname());
req->set_job(this);
priority_tracker_.Add(req->priority());
@@ -1997,6 +1989,10 @@ int HostResolverImpl::ResolveHelper(const Key& key,
source_net_log.AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_HOSTS_HIT);
return OK;
}
+
+ if (ServeLocalhost(key, info, addresses))
+ return OK;
+
return ERR_DNS_CACHE_MISS;
}
@@ -2159,6 +2155,34 @@ bool HostResolverImpl::ServeFromHosts(const Key& key,
return !addresses->empty();
}
+bool HostResolverImpl::ServeLocalhost(const Key& key,
+ const RequestInfo& info,
+ AddressList* addresses) {
+ AddressList resolved_addresses;
+ if (!ResolveLocalHostname(key.hostname, info.port(), &resolved_addresses))
+ return false;
+
+ addresses->clear();
+
+ // If the family was restricted to IPv4 due to a detected lack of IPv6
+ // support, resolve with no restrictions. (See SystemHostResolverCall
+ // for rationale.)
+ bool no_ipv6 = key.address_family == ADDRESS_FAMILY_IPV4 &&
+ !(key.host_resolver_flags &
+ HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
+
+ for (const auto& address : resolved_addresses) {
+ if (address.GetFamily() == ADDRESS_FAMILY_IPV6) {
+ if (!no_ipv6)
+ addresses->push_back(address);
+ } else if (key.address_family != ADDRESS_FAMILY_IPV6) {
Ryan Sleevi 2015/06/12 01:00:04 I don't understand this clause - could you elabora
estark 2015/06/12 05:59:46 This is the logic I intended to write: If the add
+ addresses->push_back(address);
+ }
+ }
+
+ return true;
+}
+
void HostResolverImpl::CacheResult(const Key& key,
const HostCache::Entry& entry,
base::TimeDelta ttl) {
@@ -2205,13 +2229,7 @@ HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest(
}
}
- std::string hostname = info.hostname();
- // Redirect .localhost queries to "localhost." to make sure that they
- // are never sent out on the network, per RFC 6761.
- if (IsLocalhostTLD(info.hostname()))
- hostname = kLocalhost;
-
- return Key(hostname, effective_address_family, effective_flags);
+ return Key(info.hostname(), effective_address_family, effective_flags);
}
bool HostResolverImpl::IsIPv6Reachable(const BoundNetLog& net_log) {

Powered by Google App Engine
This is Rietveld 408576698