summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Karpinski <mkarpinski@google.com>2016-10-26 10:33:26 +0100
committerMichal Karpinski <mkarpinski@google.com>2016-12-02 17:26:12 +0000
commit69e82f189b1163859e3674b9083fac23e75dba0c (patch)
tree7aec6f57cf117c03eafc55391eeac67dac7dfcf9
parenteced78ed33213f121268db02d84d49262bf09613 (diff)
downloadnetd-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.cpp4
-rw-r--r--tests/Android.mk3
-rw-r--r--tests/netd_test.cpp30
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();
}