diff options
author | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-14 17:48:39 +0000 |
---|---|---|
committer | szym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-14 17:48:39 +0000 |
commit | 45d2f8473bb5f4a6e379deaab02e11b10d498993 (patch) | |
tree | fecc0ed7edc1332c019abd93a89b32753d516084 /net/dns | |
parent | 4bd2020359df676ca25c85c092bea06f7bd66bca (diff) | |
download | chromium_src-45d2f8473bb5f4a6e379deaab02e11b10d498993.zip chromium_src-45d2f8473bb5f4a6e379deaab02e11b10d498993.tar.gz chromium_src-45d2f8473bb5f4a6e379deaab02e11b10d498993.tar.bz2 |
[net/dns] If the only name server is 0.0.0.0:53 assume DnsConfig is invalid.
When /etc/resolv.conf has no "nameserver" entries, res_ninit will default to
a single server: 0.0.0.0:53.
BUG=130808
TEST=./net_unittests --gtest_filter=DnsConfigServicePosixTest.RejectDefaultNameserver
Review URL: https://chromiumcodereview.appspot.com/10546081
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142166 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/dns')
-rw-r--r-- | net/dns/dns_config_service_posix.cc | 11 | ||||
-rw-r--r-- | net/dns/dns_config_service_posix_unittest.cc | 24 |
2 files changed, 33 insertions, 2 deletions
diff --git a/net/dns/dns_config_service_posix.cc b/net/dns/dns_config_service_posix.cc index 40c710a..5daaf69 100644 --- a/net/dns/dns_config_service_posix.cc +++ b/net/dns/dns_config_service_posix.cc @@ -14,6 +14,7 @@ #include "net/base/ip_endpoint.h" #include "net/base/net_util.h" #include "net/dns/dns_hosts.h" +#include "net/dns/dns_protocol.h" #include "net/dns/serial_worker.h" namespace net { @@ -201,8 +202,8 @@ bool ConvertResStateToDnsConfig(const struct __res_state& res, for (int i = 0; i < res.nscount; ++i) { IPEndPoint ipe; if (!ipe.FromSockAddr( - reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]), - sizeof res.nsaddr_list[i])) { + reinterpret_cast<const struct sockaddr*>(&res.nsaddr_list[i]), + sizeof res.nsaddr_list[i])) { return false; } dns_config->nameservers.push_back(ipe); @@ -222,6 +223,12 @@ bool ConvertResStateToDnsConfig(const struct __res_state& res, #endif dns_config->edns0 = res.options & RES_USE_EDNS0; + // If any name server is 0.0.0.0, assume the configuration is invalid. + // TODO(szym): Measure how often this happens. http://crbug.com/125599 + const IPAddressNumber kEmptyAddress(kIPv4AddressSize); + for (unsigned i = 0; i < dns_config->nameservers.size(); ++i) + if (dns_config->nameservers[i].address() == kEmptyAddress) + return false; return true; } #endif // !defined(OS_ANDROID) diff --git a/net/dns/dns_config_service_posix_unittest.cc b/net/dns/dns_config_service_posix_unittest.cc index 2271280..e1e2338 100644 --- a/net/dns/dns_config_service_posix_unittest.cc +++ b/net/dns/dns_config_service_posix_unittest.cc @@ -122,5 +122,29 @@ TEST(DnsConfigServicePosixTest, ConvertResStateToDnsConfig) { EXPECT_TRUE(expected_config.EqualsIgnoreHosts(config)); } +TEST(DnsConfigServicePosixTest, RejectEmptyNameserver) { + struct __res_state res = {}; + res.options = RES_INIT; + const char kDnsrch[] = "chromium.org"; + memcpy(res.defdname, kDnsrch, sizeof(kDnsrch)); + res.dnsrch[0] = res.defdname; + + struct sockaddr_in sa = {}; + sa.sin_family = AF_INET; + sa.sin_port = base::HostToNet16(NS_DEFAULTPORT); + sa.sin_addr.s_addr = INADDR_ANY; + res.nsaddr_list[0] = sa; + sa.sin_addr.s_addr = 0xCAFE1337; + res.nsaddr_list[1] = sa; + res.nscount = 2; + + DnsConfig config; + EXPECT_FALSE(internal::ConvertResStateToDnsConfig(res, &config)); + + sa.sin_addr.s_addr = 0xDEADBEEF; + res.nsaddr_list[0] = sa; + EXPECT_TRUE(internal::ConvertResStateToDnsConfig(res, &config)); +} + } // namespace } // namespace net |