Replace addrinfo with IPSockAddr to store dns addresses
The struct addrinfo is designed to store multi-addresses and it
might cause memory leaks if improperly used. IPSockAddr is safer
and is extensible. It also helps simplify the struct resolv_cache_info,
where nameservers and nscount is no longer necessary.
Bug: 130686826
Test: atest --include-subdirs packages/modules/DnsResolver
Change-Id: I3243f2f79c94ebe3d03503914d25b5863da20c09
diff --git a/res_send.cpp b/res_send.cpp
index 1dc5f57..1c98c7c 100644
--- a/res_send.cpp
+++ b/res_send.cpp
@@ -83,7 +83,6 @@
#include <arpa/inet.h>
#include <arpa/nameser.h>
-#include <netinet/in.h>
#include <errno.h>
#include <fcntl.h>
@@ -110,6 +109,7 @@
#include "res_init.h"
#include "resolv_cache.h"
#include "stats.pb.h"
+#include "util.h"
// TODO: use the namespace something like android::netd_resolv for libnetd_resolv
using android::net::CacheStatus;
@@ -136,7 +136,6 @@
static DnsTlsDispatcher sDnsTlsDispatcher;
-static int get_salen(const struct sockaddr*);
static struct sockaddr* get_nsaddr(res_state, size_t);
static int send_vc(res_state, res_params* params, const uint8_t*, int, uint8_t*, int, int*, int,
time_t*, int*, int*);
@@ -436,7 +435,7 @@
} else if (cache_status != RESOLV_CACHE_UNSUPPORTED) {
// had a cache miss for a known network, so populate the thread private
// data so the normal resolve path can do its thing
- _resolv_populate_res_for_net(statp);
+ resolv_populate_res_for_net(statp);
}
if (statp->nscount == 0) {
// We have no nameservers configured, so there's no point trying.
@@ -483,7 +482,7 @@
int delay = 0;
*rcode = RCODE_INTERNAL_ERROR;
const sockaddr* nsap = get_nsaddr(statp, ns);
- nsaplen = get_salen(nsap);
+ nsaplen = sockaddrSize(nsap);
same_ns:
// TODO: Since we expect there is only one DNS server being queried here while this
@@ -625,15 +624,6 @@
/* Private */
-static int get_salen(const struct sockaddr* sa) {
- if (sa->sa_family == AF_INET)
- return (sizeof(struct sockaddr_in));
- else if (sa->sa_family == AF_INET6)
- return (sizeof(struct sockaddr_in6));
- else
- return (0); /* unknown, die on connect */
-}
-
static struct sockaddr* get_nsaddr(res_state statp, size_t n) {
return (struct sockaddr*)(void*)&statp->nsaddrs[n];
}
@@ -675,7 +665,7 @@
LOG(INFO) << __func__ << ": using send_vc";
nsap = get_nsaddr(statp, (size_t) ns);
- nsaplen = get_salen(nsap);
+ nsaplen = sockaddrSize(nsap);
connreset = 0;
same_ns:
@@ -941,7 +931,7 @@
int resplen, n, s;
nsap = get_nsaddr(statp, (size_t) ns);
- nsaplen = get_salen(nsap);
+ nsaplen = sockaddrSize(nsap);
if (statp->nssocks[ns] == -1) {
statp->nssocks[ns] = socket(nsap->sa_family, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (statp->nssocks[ns] < 0) {
@@ -1243,7 +1233,7 @@
assert(event != nullptr);
ResState res;
res_init(&res, netContext, event);
- _resolv_populate_res_for_net(&res);
+ resolv_populate_res_for_net(&res);
*rcode = NOERROR;
return res_nsend(&res, msg, msgLen, ans, ansLen, rcode, flags);
}