summaryrefslogtreecommitdiffstats
path: root/net/dns/dns_config_service_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/dns/dns_config_service_win.cc')
-rw-r--r--net/dns/dns_config_service_win.cc16
1 files changed, 16 insertions, 0 deletions
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc
index b26e677..b8fd8ce 100644
--- a/net/dns/dns_config_service_win.cc
+++ b/net/dns/dns_config_service_win.cc
@@ -316,6 +316,20 @@ class RegistryWatcher : public base::win::ObjectWatcher::Delegate,
DISALLOW_COPY_AND_ASSIGN(RegistryWatcher);
};
+// Returns true iff |address| is DNS address from IPv6 stateless discovery,
+// i.e., matches fec0:0:0:ffff::{1,2,3}.
+// http://tools.ietf.org/html/draft-ietf-ipngwg-dns-discovery
+bool IsStatelessDiscoveryAddress(const IPAddressNumber& address) {
+ if (address.size() != kIPv6AddressSize)
+ return false;
+ const uint8 kPrefix[] = {
+ 0xfe, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
+ return std::equal(kPrefix, kPrefix + arraysize(kPrefix),
+ address.begin()) && (address.back() < 4);
+}
+
} // namespace
FilePath GetHostsPath() {
@@ -374,6 +388,8 @@ ConfigParseWinResult ConvertSettingsToDnsConfig(
IPEndPoint ipe;
if (ipe.FromSockAddr(address->Address.lpSockaddr,
address->Address.iSockaddrLength)) {
+ if (IsStatelessDiscoveryAddress(ipe.address()))
+ continue;
// Override unset port.
if (!ipe.port())
ipe = IPEndPoint(ipe.address(), dns_protocol::kDefaultPort);