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;
 }