Simplify freeaddrinfo()
No functionality changes. Just acknowledge that our implementation
tolerates null and simplify callers to take advantage of it.
Test: m netd_integration_test
Change-Id: Ib59166f27faec3ecb4ad94d86cedc33ea066b259
diff --git a/resolv/getaddrinfo.cpp b/resolv/getaddrinfo.cpp
index f66f59e..8abfea8 100644
--- a/resolv/getaddrinfo.cpp
+++ b/resolv/getaddrinfo.cpp
@@ -40,9 +40,6 @@
* says to use inet_aton() to convert IPv4 numeric to binary (alows
* classful form as a result).
* current code - disallow classful form for IPv4 (due to use of inet_pton).
- * - freeaddrinfo(NULL). RFC2553 is silent about it. XNET 5.2 says it is
- * invalid.
- * current code - SEGV on freeaddrinfo(NULL)
* Note:
* - We use getipnodebyname() just for thread-safeness. There's no intent
* to let it do PF_UNSPEC (actually we never pass PF_UNSPEC to
@@ -266,17 +263,13 @@
}
void freeaddrinfo(struct addrinfo* ai) {
- struct addrinfo* next;
-
- if (ai == NULL) return;
-
- do {
- next = ai->ai_next;
+ while (ai) {
+ struct addrinfo* next = ai->ai_next;
if (ai->ai_canonname) free(ai->ai_canonname);
- /* no need to free(ai->ai_addr) */
+ // Also frees ai->ai_addr which points to extra space beyond addrinfo
free(ai);
ai = next;
- } while (ai);
+ }
}
static int str2number(const char* p) {
@@ -506,7 +499,7 @@
}
free:
bad:
- if (sentinel.ai_next) freeaddrinfo(sentinel.ai_next);
+ freeaddrinfo(sentinel.ai_next);
*res = NULL;
return error;
}
@@ -541,7 +534,7 @@
}
free:
- if (result) freeaddrinfo(result);
+ freeaddrinfo(result);
return error;
}
@@ -602,7 +595,7 @@
return 0;
free:
- if (sentinel.ai_next) freeaddrinfo(sentinel.ai_next);
+ freeaddrinfo(sentinel.ai_next);
return error;
}
@@ -682,7 +675,7 @@
free:
bad:
- if (sentinel.ai_next) freeaddrinfo(sentinel.ai_next);
+ freeaddrinfo(sentinel.ai_next);
return error;
}