]> granicus.if.org Git - sudo/commitdiff
Avoid malloc(0) and fix the loop invariant for the getifaddrs() case.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 14 Mar 2003 02:17:38 +0000 (02:17 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 14 Mar 2003 02:17:38 +0000 (02:17 +0000)
interfaces.c

index 03a47c783f8fabf0d223129cda17b0d3208ed02e..43c7bf9c59cfb7b5a0537fd69f6e29bce36f124e 100644 (file)
@@ -121,7 +121,7 @@ load_interfaces()
        return;
 
     /* Allocate space for the interfaces list. */
-    for (ifa = ifaddrs; ifa -> ifa_next; ifa = ifa -> ifa_next) {
+    for (ifa = ifaddrs; ifa != NULL; ifa = ifa -> ifa_next) {
        /* Skip interfaces marked "down" and "loopback". */
        if (ifa->ifa_addr == NULL || !(ifa->ifa_flags & IFF_UP) ||
            (ifa->ifa_flags & IFF_LOOPBACK))
@@ -134,11 +134,13 @@ load_interfaces()
                break;
        }
     }
+    if (num_interfaces == 0)
+       return;
     interfaces =
        (struct interface *) emalloc2(num_interfaces, sizeof(struct interface));
 
     /* Store the ip addr / netmask pairs. */
-    for (ifa = ifaddrs, i = 0; ifa -> ifa_next; ifa = ifa -> ifa_next) {
+    for (ifa = ifaddrs, i = 0; ifa != NULL; ifa = ifa -> ifa_next) {
        /* Skip interfaces marked "down" and "loopback". */
        if (ifa->ifa_addr == NULL || !(ifa->ifa_flags & IFF_UP) ||
            (ifa->ifa_flags & IFF_LOOPBACK))
@@ -191,7 +193,7 @@ load_interfaces()
     }
 
     /*
-     * Get interface configuration or return (leaving num_interfaces 0)
+     * Get interface configuration or return (leaving num_interfaces == 0)
      */
     for (;;) {
        ifconf_buf = erealloc(ifconf_buf, len);
@@ -216,6 +218,8 @@ load_interfaces()
            break;
        len += BUFSIZ;
     }
+    if (n == 0)
+       return;
 
     /* Allocate space for the maximum number of interfaces that could exist. */
     n = ifconf->ifc_len / sizeof(struct ifreq);