Hi,

claudios bgpd diff and florian mentioning rad(8) made me look into usr.sbin/
for getifaddrs() usage. I think these need a NULL check as well.

ok?

diff --git usr.sbin/ospf6d/parse.y usr.sbin/ospf6d/parse.y
index f163e24149d..509aa2f2e88 100644
--- usr.sbin/ospf6d/parse.y
+++ usr.sbin/ospf6d/parse.y
@@ -1253,7 +1253,8 @@ get_rtr_id(void)
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
                if (strncmp(ifa->ifa_name, "carp", 4) == 0)
                        continue;
-               if (ifa->ifa_addr->sa_family != AF_INET)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET)
                        continue;
                cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
                if ((cur & localnet) == localnet)       /* skip 127/8 */
diff --git usr.sbin/ospfd/parse.y usr.sbin/ospfd/parse.y
index a09696504f8..3fbcca0c911 100644
--- usr.sbin/ospfd/parse.y
+++ usr.sbin/ospfd/parse.y
@@ -1469,7 +1469,8 @@ get_rtr_id(void)
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
                if (strncmp(ifa->ifa_name, "carp", 4) == 0)
                        continue;
-               if (ifa->ifa_addr->sa_family != AF_INET)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET)
                        continue;
                cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
                if ((cur & localnet) == localnet)       /* skip 127/8 */
diff --git usr.sbin/pppd/sys-bsd.c usr.sbin/pppd/sys-bsd.c
index e8deee6d2ff..73f0e287938 100644
--- usr.sbin/pppd/sys-bsd.c
+++ usr.sbin/pppd/sys-bsd.c
@@ -1334,6 +1334,8 @@ get_ether_addr(ipaddr, hwaddr)
      * address on the same subnet as `ipaddr'.
      */
     for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+       if (ifa->ifa_addr == NULL)
+               continue;
        if (ifa->ifa_addr->sa_family == AF_INET) {
            ina = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
            /*
@@ -1367,6 +1369,8 @@ get_ether_addr(ipaddr, hwaddr)
      */
     ifp = ifa;
     for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+       if (ifa->ifa_addr == NULL)
+               continue;
        if (strcmp(ifp->ifa_name, ifa->ifa_name) == 0
            && ifa->ifa_addr->sa_family == AF_LINK) {
            /*
@@ -1418,8 +1422,9 @@ GetMask(addr)
        /*
         * Check the interface's internet address.
         */
-       if (ifa->ifa_addr->sa_family != AF_INET)
-           continue;
+       if (ifa->ifa_addr == NULL ||
+           ifa->ifa_addr->sa_family != AF_INET)
+               continue;
        ina = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
        if ((ntohl(ina) & nmask) != (addr & nmask))
            continue;
diff --git usr.sbin/rad/frontend.c usr.sbin/rad/frontend.c
index b69e9b7b0a3..c4dcf46e068 100644
--- usr.sbin/rad/frontend.c
+++ usr.sbin/rad/frontend.c
@@ -731,7 +731,8 @@ get_link_state(char *if_name)
                return LINK_STATE_UNKNOWN;
        }
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
-               if (ifa->ifa_addr->sa_family != AF_LINK)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_LINK)
                        continue;
                if (strcmp(if_name, ifa->ifa_name) != 0)
                        continue;
@@ -969,7 +970,8 @@ interface_has_linklocal_address(char *name)
        for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
                if (strcmp(name, ifa->ifa_name) != 0)
                        continue;
-               if (ifa->ifa_addr->sa_family != AF_INET6)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET6)
                        continue;
 
                sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
@@ -1013,7 +1015,8 @@ get_interface_prefixes(struct ra_iface *ra_iface, struct 
ra_prefix_conf
        for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
                if (strcmp(ra_iface->name, ifa->ifa_name) != 0)
                        continue;
-               if (ifa->ifa_addr->sa_family != AF_INET6)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET6)
                        continue;
 
                sin6 = (struct sockaddr_in6 *)ifa->ifa_addr;
diff --git usr.sbin/rarpd/rarpd.c usr.sbin/rarpd/rarpd.c
index f3227883404..7652dcd3c4f 100644
--- usr.sbin/rarpd/rarpd.c
+++ usr.sbin/rarpd/rarpd.c
@@ -200,6 +200,8 @@ init_all(void)
                error("getifaddrs: %s", strerror(errno));
 
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+               if (ifa->ifa_addr == NULL)
+                       continue;
                sdl = (struct sockaddr_dl *)ifa->ifa_addr;
                if (sdl->sdl_family != AF_LINK || sdl->sdl_type != IFT_ETHER ||
                    sdl->sdl_alen != 6)
@@ -513,6 +515,8 @@ lookup_addrs(char *ifname, struct if_info *p)
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
                if (strcmp(ifa->ifa_name, ifname))
                        continue;
+               if (ifa->ifa_addr == NULL)
+                       continue;
                sdl = (struct sockaddr_dl *) ifa->ifa_addr;
                if (sdl->sdl_family == AF_LINK &&
                    sdl->sdl_type == IFT_ETHER && sdl->sdl_alen == 6) {
diff --git usr.sbin/relayd/parse.y usr.sbin/relayd/parse.y
index b20f2480752..55fe880ce3e 100644
--- usr.sbin/relayd/parse.y
+++ usr.sbin/relayd/parse.y
@@ -3186,7 +3186,8 @@ host_if(const char *s, struct addresslist *al, int max,
 
  nextaf:
        for (p = ifap; p != NULL && cnt < max; p = p->ifa_next) {
-               if (p->ifa_addr->sa_family != af ||
+               if (p->ifa_addr == NULL ||
+                   p->ifa_addr->sa_family != af ||
                    (strcmp(s, p->ifa_name) != 0 &&
                    !is_if_in_group(p->ifa_name, s)))
                        continue;
diff --git usr.sbin/route6d/route6d.c usr.sbin/route6d/route6d.c
index ee1cf0b6d1c..7c8b9105e5e 100644
--- usr.sbin/route6d/route6d.c
+++ usr.sbin/route6d/route6d.c
@@ -1370,7 +1370,8 @@ ifconfig(void)
        }
 
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
-               if (ifa->ifa_addr->sa_family != AF_INET6)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET6)
                        continue;
                ifcp = ifc_find(ifa->ifa_name);
                /* we are interested in multicast-capable interfaces */
diff --git usr.sbin/ypbind/ypbind.c usr.sbin/ypbind/ypbind.c
index a4ce3f62ff1..3e5498fb3aa 100644
--- usr.sbin/ypbind/ypbind.c
+++ usr.sbin/ypbind/ypbind.c
@@ -757,7 +757,8 @@ broadcast(struct _dom_binding *ypdb, char *buf, int outlen)
                return -1;
        }
        for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
-               if (ifa->ifa_addr->sa_family != AF_INET)
+               if (ifa->ifa_addr == NULL ||
+                   ifa->ifa_addr->sa_family != AF_INET)
                        continue;
                if ((ifa->ifa_flags & IFF_UP) == 0)
                        continue;

Reply via email to