Index: net/dns/host_resolver_impl.cc |
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc |
index d5602a4c674cad2848bb9d28cc77b0ad85d5333f..853eb54dfd1e95c2d23b8db1f9e73ccf1c86ccfd 100644 |
--- a/net/dns/host_resolver_impl.cc |
+++ b/net/dns/host_resolver_impl.cc |
@@ -35,6 +35,7 @@ |
#include "net/base/dns_reloader.h" |
#include "net/base/dns_util.h" |
#include "net/base/host_port_pair.h" |
+#include "net/base/ip_endpoint.h" |
#include "net/base/net_errors.h" |
#include "net/base/net_log.h" |
#include "net/base/net_util.h" |
@@ -182,7 +183,7 @@ bool IsGloballyReachable(const IPAddressNumber& dest, |
rv = socket->GetLocalAddress(&endpoint); |
if (rv != OK) |
return false; |
- DCHECK(endpoint.GetFamily() == ADDRESS_FAMILY_IPV6); |
+ DCHECK_EQ(ADDRESS_FAMILY_IPV6, endpoint.GetFamily()); |
const IPAddressNumber& address = endpoint.address(); |
bool is_link_local = (address[0] == 0xFE) && ((address[1] & 0xC0) == 0x80); |
if (is_link_local) |
@@ -2032,10 +2033,18 @@ bool HostResolverImpl::ResolveAsIP(const Key& key, |
~(HOST_RESOLVER_CANONNAME | HOST_RESOLVER_LOOPBACK_ONLY | |
HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6), |
0) << " Unhandled flag"; |
- bool ipv6_disabled = (default_address_family_ == ADDRESS_FAMILY_IPV4) && |
- !probe_ipv6_support_; |
+ |
*net_error = OK; |
- if ((ip_number.size() == kIPv6AddressSize) && ipv6_disabled) { |
+ AddressFamily family = GetAddressFamily(ip_number); |
+ if (family == ADDRESS_FAMILY_IPV6 && |
+ !probe_ipv6_support_ && |
+ default_address_family_ == ADDRESS_FAMILY_IPV4) { |
+ // Don't return IPv6 addresses if default address family is set to IPv4, |
+ // and probes are disabled. |
+ *net_error = ERR_NAME_NOT_RESOLVED; |
+ } else if (key.address_family != ADDRESS_FAMILY_UNSPECIFIED && |
+ key.address_family != family) { |
+ // Don't return IPv6 addresses for IPv4 queries, and vice versa. |
*net_error = ERR_NAME_NOT_RESOLVED; |
} else { |
*addresses = AddressList::CreateFromIPAddress(ip_number, info.port()); |