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.
*/