diff options
author | Michal Karpinski <mkarpinski@google.com> | 2016-10-26 10:33:26 +0100 |
---|---|---|
committer | Michal Karpinski <mkarpinski@google.com> | 2016-12-02 17:26:12 +0000 |
commit | 69e82f189b1163859e3674b9083fac23e75dba0c (patch) | |
tree | 7aec6f57cf117c03eafc55391eeac67dac7dfcf9 | |
parent | eced78ed33213f121268db02d84d49262bf09613 (diff) | |
download | netd-69e82f189b1163859e3674b9083fac23e75dba0c.tar.gz |
DO NOT MERGE Add null check for hp in DnsProxyListener::GetHostByNameHandler
Bug: 32399924
Bug: 29748723
Test: runtest -x netd_integration_test.cpp
(cherry picked from commit 7a8a601190f948f18b1cc8c043f3a265c1ed183e)
Change-Id: I8e47c2461dc7e8bf34128a2d56ba936e2535c262
-rw-r--r-- | server/DnsProxyListener.cpp | 4 | ||||
-rw-r--r-- | tests/Android.mk | 3 | ||||
-rw-r--r-- | tests/netd_test.cpp | 30 |
3 files changed, 33 insertions, 4 deletions
diff --git a/server/DnsProxyListener.cpp b/server/DnsProxyListener.cpp index dc31b1aa..861f9c18 100644 --- a/server/DnsProxyListener.cpp +++ b/server/DnsProxyListener.cpp @@ -434,14 +434,14 @@ void DnsProxyListener::GetHostByNameHandler::run() { std::vector<String16> ip_addrs; int total_ip_addr_count = 0; if (mReportingLevel == INetdEventListener::REPORTING_LEVEL_FULL) { - if (hp->h_addrtype == AF_INET) { + if (hp != nullptr && hp->h_addrtype == AF_INET) { in_addr** list = (in_addr**) hp->h_addr_list; for (int i = 0; list[i] != NULL; i++) { sockaddr_in sin = { .sin_family = AF_INET, .sin_addr = *list[i] }; addIpAddrWithinLimit(ip_addrs, (sockaddr*) &sin, sizeof(sin)); total_ip_addr_count++; } - } else if (hp->h_addrtype == AF_INET6) { + } else if (hp != nullptr && hp->h_addrtype == AF_INET6) { in6_addr** list = (in6_addr**) hp->h_addr_list; for (int i = 0; list[i] != NULL; i++) { sockaddr_in6 sin6 = { .sin6_family = AF_INET6, .sin6_addr = *list[i] }; diff --git a/tests/Android.mk b/tests/Android.mk index b58b78ef..bf696929 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -35,7 +35,8 @@ LOCAL_SRC_FILES := binder_test.cpp \ dns_responder/dns_responder.cpp \ netd_integration_test.cpp \ netd_test.cpp \ - ../server/NetdConstants.cpp + ../server/NetdConstants.cpp \ + ../server/binder/android/net/metrics/INetdEventListener.aidl LOCAL_MODULE_TAGS := eng tests include $(BUILD_NATIVE_TEST) diff --git a/tests/netd_test.cpp b/tests/netd_test.cpp index 6c7fdac0..a958cd90 100644 --- a/tests/netd_test.cpp +++ b/tests/netd_test.cpp @@ -52,11 +52,13 @@ #include "ResolverStats.h" #include "android/net/INetd.h" +#include "android/net/metrics/INetdEventListener.h" #include "binder/IServiceManager.h" using android::base::StringPrintf; using android::base::StringAppendF; using android::net::ResolverStats; +using android::net::metrics::INetdEventListener; // Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used. // TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host, @@ -125,13 +127,29 @@ class AddrInfo { }; class ResolverTest : public ::testing::Test, public DnsResponderClient { +private: + int mOriginalMetricsLevel; + protected: virtual void SetUp() { // Ensure resolutions go via proxy. DnsResponderClient::SetUp(); + + // If DNS reporting is off: turn it on so we run through everything. + auto rv = mNetdSrv->getMetricsReportingLevel(&mOriginalMetricsLevel); + ASSERT_TRUE(rv.isOk()); + if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) { + rv = mNetdSrv->setMetricsReportingLevel(INetdEventListener::REPORTING_LEVEL_FULL); + ASSERT_TRUE(rv.isOk()); + } } virtual void TearDown() { + if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) { + auto rv = mNetdSrv->setMetricsReportingLevel(mOriginalMetricsLevel); + ASSERT_TRUE(rv.isOk()); + } + DnsResponderClient::TearDown(); } @@ -257,20 +275,30 @@ TEST_F(ResolverTest, GetHostByName) { const char* listen_addr = "127.0.0.3"; const char* listen_srv = "53"; const char* host_name = "hello.example.com."; + const char *nonexistent_host_name = "nonexistent.example.com."; test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail, 1.0); dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3"); ASSERT_TRUE(dns.startServer()); std::vector<std::string> servers = { listen_addr }; ASSERT_TRUE(SetResolversForNetwork(mDefaultSearchDomains, servers, mDefaultParams)); + const hostent* result; + + dns.clearQueries(); + result = gethostbyname("nonexistent"); + EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name)); + ASSERT_TRUE(result == nullptr); + ASSERT_EQ(HOST_NOT_FOUND, h_errno); + dns.clearQueries(); - const hostent* result = gethostbyname("hello"); + result = gethostbyname("hello"); EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name)); ASSERT_FALSE(result == nullptr); ASSERT_EQ(4, result->h_length); ASSERT_FALSE(result->h_addr_list[0] == nullptr); EXPECT_EQ("1.2.3.3", ToString(result)); EXPECT_TRUE(result->h_addr_list[1] == nullptr); + dns.stopServer(); } |