summaryrefslogtreecommitdiffstats
path: root/net/dns
diff options
context:
space:
mode:
authorszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 17:48:39 +0000
committerszym@chromium.org <szym@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 17:48:39 +0000
commit45d2f8473bb5f4a6e379deaab02e11b10d498993 (patch)
treefecc0ed7edc1332c019abd93a89b32753d516084 /net/dns
parent4bd2020359df676ca25c85c092bea06f7bd66bca (diff)
downloadchromium_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.cc11
-rw-r--r--net/dns/dns_config_service_posix_unittest.cc24
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