summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-15 09:29:42 +0000
committerszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-15 09:29:42 +0000
commit8fe381e9c7ebec0b30ba72791fbe43362003459a (patch)
tree710e12c8f0401d245116049b7fbfaf128c6b4f5a /net
parentd402bd052841a261123e0f1bd658b5b4aa0097b7 (diff)
downloadchromium_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.cc16
-rw-r--r--net/dns/dns_config_service_win_unittest.cc9
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" } },