#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"
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)
~(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());
addresses->clear();
// HOSTS lookups are case-insensitive.
- std::string hostname = StringToLowerASCII(key.hostname);
+ std::string hostname = base::StringToLowerASCII(key.hostname);
const DnsHosts& hosts = dns_client_->GetConfig()->hosts;