Cleanup: eliminate pointer in getaddrinfo's main loop
No functionality change. Makes it slightly easier to reason about this
code.
Test: atest resolv_integration_test resolv_unit_test
Change-Id: I6b53920524be3ac24eb8d61d024158441cf194bc
diff --git a/resolv/getaddrinfo.cpp b/resolv/getaddrinfo.cpp
index 7369b9b..5abd472 100644
--- a/resolv/getaddrinfo.cpp
+++ b/resolv/getaddrinfo.cpp
@@ -273,7 +273,6 @@
int error = 0;
struct addrinfo ai;
struct addrinfo ai0;
- struct addrinfo* pai;
const struct explore* ex;
/* hostname is allowed to be NULL */
@@ -282,15 +281,16 @@
assert(res != NULL);
assert(netcontext != NULL);
cur = &sentinel;
- pai = &ai;
- pai->ai_flags = 0;
- pai->ai_family = PF_UNSPEC;
- pai->ai_socktype = ANY;
- pai->ai_protocol = ANY;
- pai->ai_addrlen = 0;
- pai->ai_canonname = NULL;
- pai->ai_addr = NULL;
- pai->ai_next = NULL;
+
+ ai.ai_flags = 0;
+ ai.ai_family = PF_UNSPEC;
+ ai.ai_socktype = ANY;
+ ai.ai_protocol = ANY;
+ ai.ai_addrlen = 0;
+ ai.ai_canonname = nullptr;
+ ai.ai_addr = nullptr;
+ ai.ai_next = nullptr;
+
do {
if (hostname == NULL && servname == NULL) {
error = EAI_NONAME;
@@ -312,18 +312,19 @@
error = EAI_FAMILY;
break;
}
- *pai = *hints;
+
+ ai = *hints;
/*
* if both socktype/protocol are specified, check if they
* are meaningful combination.
*/
- if (pai->ai_socktype != ANY && pai->ai_protocol != ANY) {
+ if (ai.ai_socktype != ANY && ai.ai_protocol != ANY) {
for (ex = explore_options; ex->e_af >= 0; ex++) {
- if (pai->ai_family != ex->e_af) continue;
+ if (ai.ai_family != ex->e_af) continue;
if (ex->e_socktype == ANY) continue;
if (ex->e_protocol == ANY) continue;
- if (pai->ai_socktype == ex->e_socktype && pai->ai_protocol != ex->e_protocol) {
+ if (ai.ai_socktype == ex->e_socktype && ai.ai_protocol != ex->e_protocol) {
error = EAI_BADHINTS;
break;
}
@@ -337,41 +338,39 @@
* socktype/protocol are left unspecified. (2) servname is disallowed
* for raw and other inet{,6} sockets.
*/
- if (MATCH_FAMILY(pai->ai_family, PF_INET, 1)
- || MATCH_FAMILY(pai->ai_family, PF_INET6, 1)
- ) {
- ai0 = *pai; /* backup *pai */
+ if (MATCH_FAMILY(ai.ai_family, PF_INET, 1) || MATCH_FAMILY(ai.ai_family, PF_INET6, 1)) {
+ ai0 = ai; // backup ai
- if (pai->ai_family == PF_UNSPEC) {
- pai->ai_family = PF_INET6;
+ if (ai.ai_family == PF_UNSPEC) {
+ ai.ai_family = PF_INET6;
}
- error = get_portmatch(pai, servname);
+ error = get_portmatch(&ai, servname);
if (error) break;
- *pai = ai0;
+ ai = ai0; // restore ai
}
- ai0 = *pai;
+ ai0 = ai;
/* NULL hostname, or numeric hostname */
for (ex = explore_options; ex->e_af >= 0; ex++) {
- *pai = ai0;
+ ai = ai0;
/* PF_UNSPEC entries are prepared for DNS queries only */
if (ex->e_af == PF_UNSPEC) continue;
- if (!MATCH_FAMILY(pai->ai_family, ex->e_af, WILD_AF(ex))) continue;
- if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) continue;
- if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) continue;
+ if (!MATCH_FAMILY(ai.ai_family, ex->e_af, WILD_AF(ex))) continue;
+ if (!MATCH(ai.ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) continue;
+ if (!MATCH(ai.ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) continue;
- if (pai->ai_family == PF_UNSPEC) pai->ai_family = ex->e_af;
- if (pai->ai_socktype == ANY && ex->e_socktype != ANY) pai->ai_socktype = ex->e_socktype;
- if (pai->ai_protocol == ANY && ex->e_protocol != ANY) pai->ai_protocol = ex->e_protocol;
+ if (ai.ai_family == PF_UNSPEC) ai.ai_family = ex->e_af;
+ if (ai.ai_socktype == ANY && ex->e_socktype != ANY) ai.ai_socktype = ex->e_socktype;
+ if (ai.ai_protocol == ANY && ex->e_protocol != ANY) ai.ai_protocol = ex->e_protocol;
if (hostname == NULL)
- error = explore_null(pai, servname, &cur->ai_next);
+ error = explore_null(&ai, servname, &cur->ai_next);
else
- error = explore_numeric_scope(pai, hostname, servname, &cur->ai_next);
+ error = explore_numeric_scope(&ai, hostname, servname, &cur->ai_next);
if (error) break;
@@ -390,7 +389,7 @@
error = EAI_NODATA;
break;
}
- if (pai->ai_flags & AI_NUMERICHOST) {
+ if (ai.ai_flags & AI_NUMERICHOST) {
error = EAI_NONAME;
break;
}
@@ -401,22 +400,22 @@
* outer loop by AFs.
*/
for (ex = explore_options; ex->e_af >= 0; ex++) {
- *pai = ai0;
+ ai = ai0;
/* require exact match for family field */
- if (pai->ai_family != ex->e_af) continue;
+ if (ai.ai_family != ex->e_af) continue;
- if (!MATCH(pai->ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) {
+ if (!MATCH(ai.ai_socktype, ex->e_socktype, WILD_SOCKTYPE(ex))) {
continue;
}
- if (!MATCH(pai->ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) {
+ if (!MATCH(ai.ai_protocol, ex->e_protocol, WILD_PROTOCOL(ex))) {
continue;
}
- if (pai->ai_socktype == ANY && ex->e_socktype != ANY) pai->ai_socktype = ex->e_socktype;
- if (pai->ai_protocol == ANY && ex->e_protocol != ANY) pai->ai_protocol = ex->e_protocol;
+ if (ai.ai_socktype == ANY && ex->e_socktype != ANY) ai.ai_socktype = ex->e_socktype;
+ if (ai.ai_protocol == ANY && ex->e_protocol != ANY) ai.ai_protocol = ex->e_protocol;
- error = explore_fqdn(pai, hostname, servname, &cur->ai_next, netcontext);
+ error = explore_fqdn(&ai, hostname, servname, &cur->ai_next, netcontext);
while (cur->ai_next) cur = cur->ai_next;
}