Hi, these last ones are a bit different from the others:
Two cases in libc, two in ifconfig, and one in isakmpd that is a bit tricky. comments? ok? diff --git lib/libc/rpc/get_myaddress.c lib/libc/rpc/get_myaddress.c index d0ac78f796e..b84968e1807 100644 --- lib/libc/rpc/get_myaddress.c +++ lib/libc/rpc/get_myaddress.c @@ -67,6 +67,7 @@ get_myaddress(struct sockaddr_in *addr) again: for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if ((ifa->ifa_flags & IFF_UP) && + ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == AF_INET && (loopback == 1 && (ifa->ifa_flags & IFF_LOOPBACK))) { *addr = *((struct sockaddr_in *)ifa->ifa_addr); diff --git lib/libc/rpc/pmap_rmt.c lib/libc/rpc/pmap_rmt.c index 097999b5ae6..a6c41cf7175 100644 --- lib/libc/rpc/pmap_rmt.c +++ lib/libc/rpc/pmap_rmt.c @@ -163,7 +163,8 @@ newgetbroadcastnets(struct in_addr **addrsp) return 0; 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_BROADCAST) && (ifa->ifa_flags & IFF_UP) && @@ -180,7 +181,8 @@ newgetbroadcastnets(struct in_addr **addrsp) } 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_BROADCAST) && (ifa->ifa_flags & IFF_UP) && diff --git regress/sys/netinet/in_pcbbind/runtest.c regress/sys/netinet/in_pcbbind/runtest.c index e26d2832dce..bb93cc71415 100644 --- regress/sys/netinet/in_pcbbind/runtest.c +++ regress/sys/netinet/in_pcbbind/runtest.c @@ -415,7 +415,8 @@ main(int argc, char *argv[]) err(2, "getifaddrs()"); curifa = ifap; while (curifa) { - if (memcmp(curifa->ifa_addr, + if (curifa->ifa_addr != NULL && + memcmp(curifa->ifa_addr, mifa->ai_addr, mifa->ai_addrlen) == 0) break; diff --git sbin/ifconfig/ifconfig.c sbin/ifconfig/ifconfig.c index 3799cc3a8e9..4dfcc628ce6 100644 --- sbin/ifconfig/ifconfig.c +++ sbin/ifconfig/ifconfig.c @@ -1180,12 +1180,13 @@ printif(char *name, int ifaliases) } } /* quickhack: sizeof(ifr) < sizeof(ifr6) */ - if (ifa->ifa_addr->sa_family == AF_INET6) { + if (ifa->ifa_addr != NULL && + ifa->ifa_addr->sa_family == AF_INET6) { memset(&ifr6, 0, sizeof(ifr6)); memcpy(&ifr6.ifr_addr, ifa->ifa_addr, MINIMUM(sizeof(ifr6.ifr_addr), ifa->ifa_addr->sa_len)); ifrp = (struct ifreq *)&ifr6; - } else { + } else if (ifa->ifa_addr != NULL) { memset(&ifr, 0, sizeof(ifr)); memcpy(&ifr.ifr_addr, ifa->ifa_addr, MINIMUM(sizeof(ifr.ifr_addr), ifa->ifa_addr->sa_len)); @@ -1194,7 +1195,8 @@ printif(char *name, int ifaliases) strlcpy(ifname, ifa->ifa_name, sizeof(ifname)); strlcpy(ifrp->ifr_name, ifa->ifa_name, sizeof(ifrp->ifr_name)); - if (ifa->ifa_addr->sa_family == AF_LINK) { + if (ifa->ifa_addr != NULL && + ifa->ifa_addr->sa_family == AF_LINK) { namep = ifa->ifa_name; if (getinfo(ifrp, 0) < 0) continue; @@ -1209,8 +1211,9 @@ printif(char *name, int ifaliases) if (!namep || !strcmp(namep, ifa->ifa_name)) { const struct afswtch *p; - if (ifa->ifa_addr->sa_family == AF_INET && - ifaliases == 0 && noinet == 0) + if (ifa->ifa_addr == NULL || + (ifa->ifa_addr->sa_family == AF_INET && + ifaliases == 0 && noinet == 0)) continue; if ((p = afp) != NULL) { if (ifa->ifa_addr->sa_family == p->af_af) diff --git sbin/isakmpd/virtual.c sbin/isakmpd/virtual.c index 52a692a72c0..6d0db8cd004 100644 --- sbin/isakmpd/virtual.c +++ sbin/isakmpd/virtual.c @@ -334,17 +334,23 @@ virtual_bind_if(char *ifname, struct sockaddr *if_addr, void *arg) char *addr_str; int s, error; - if (sockaddr2text(if_addr, &addr_str, 0)) + addr_str = 0; + if (if_addr != NULL && + sockaddr2text(if_addr, &addr_str, 0)) addr_str = 0; LOG_DBG((LOG_TRANSPORT, 90, "virtual_bind_if: interface %s family %s address %s", ifname ? ifname : "<unknown>", - if_addr->sa_family == AF_INET ? "v4" : - (if_addr->sa_family == AF_INET6 ? "v6" : "<unknown>"), + if_addr == NULL ? "<invalid>" : + (if_addr->sa_family == AF_INET ? "v4" : + (if_addr->sa_family == AF_INET6 ? "v6" : "<unknown>")), addr_str ? addr_str : "<invalid>")); free(addr_str); + if (if_addr == NULL) + return 0; + /* * Drop non-Internet stuff. */