diff options
author | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-15 09:29:42 +0000 |
---|---|---|
committer | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-15 09:29:42 +0000 |
commit | 8fe381e9c7ebec0b30ba72791fbe43362003459a (patch) | |
tree | 710e12c8f0401d245116049b7fbfaf128c6b4f5a /net | |
parent | d402bd052841a261123e0f1bd658b5b4aa0097b7 (diff) | |
download | chromium_src-8fe381e9c7ebec0b30ba72791fbe43362003459a.zip chromium_src-8fe381e9c7ebec0b30ba72791fbe43362003459a.tar.gz chromium_src-8fe381e9c7ebec0b30ba72791fbe43362003459a.tar.bz2 |
[net/dns] Ignore DNS addresses from stateless IPv6 DNS discovery.
On Windows XP with IPv6 support, Teredo interfaces always get default DNS servers:
fec0:0:0:ffff::{1,2,3}.
We will tentatively ignore such interfaces completely when determining the system
DnsConfig.
BUG=140540
Review URL: https://chromiumcodereview.appspot.com/11829039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@176867 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r-- | net/dns/dns_config_service_win.cc | 16 | ||||
-rw-r--r-- | net/dns/dns_config_service_win_unittest.cc | 9 |
2 files changed, 21 insertions, 4 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); diff --git a/net/dns/dns_config_service_win_unittest.cc b/net/dns/dns_config_service_win_unittest.cc index 44594087..092985c 100644 --- a/net/dns/dns_config_service_win_unittest.cc +++ b/net/dns/dns_config_service_win_unittest.cc @@ -144,20 +144,21 @@ TEST(DnsConfigServiceWinTest, ConvertAdapterAddresses) { "chromium.org", { 1024, 24 }, }, - { // Use the preferred adapter (first in binding order). + { // Use the preferred adapter (first in binding order) and filter + // stateless DNS discovery addresses. { { IF_TYPE_SOFTWARE_LOOPBACK, IfOperStatusUp, L"funnyloop", { "2.0.0.2" } }, { IF_TYPE_FASTETHER, IfOperStatusUp, L"example.com", - { "1.0.0.1" } }, + { "1.0.0.1", "fec0:0:0:ffff::2", "8.8.8.8" } }, { IF_TYPE_USB, IfOperStatusUp, L"chromium.org", { "10.0.0.10", "2001:FFFF::1111" } }, { 0 }, }, - { "1.0.0.1" }, + { "1.0.0.1", "8.8.8.8" }, "example.com", }, - { // No usable nameservers. + { // No usable adapters. { { IF_TYPE_SOFTWARE_LOOPBACK, IfOperStatusUp, L"localhost", { "2.0.0.2" } }, |