summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbenno <benno@openbsd.org>2020-12-30 18:57:28 +0000
committerbenno <benno@openbsd.org>2020-12-30 18:57:28 +0000
commitce037e3a45002a29fec78edd03c2f7071cc06bae (patch)
tree315938939863c7a85f46a3d4bc5c84a3a6b04a55
parentgetifaddrs() can return entries where ifa_addr is NULL. Check for this (diff)
downloadwireguard-openbsd-ce037e3a45002a29fec78edd03c2f7071cc06bae.tar.xz
wireguard-openbsd-ce037e3a45002a29fec78edd03c2f7071cc06bae.zip
getifaddrs() can return entries where ifa_addr is NULL. Check for this
before accessing anything in ifa_addr. ok claudio@
-rw-r--r--sbin/ifconfig/ifconfig.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 3799cc3a8e9..3d8f6b3b9c2 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ifconfig.c,v 1.430 2020/11/06 21:24:47 kn Exp $ */
+/* $OpenBSD: ifconfig.c,v 1.431 2020/12/30 18:57:28 benno Exp $ */
/* $NetBSD: ifconfig.c,v 1.40 1997/10/01 02:19:43 enami Exp $ */
/*
@@ -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)