summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2020-12-29 09:49:04 +0000
committerclaudio <claudio@openbsd.org>2020-12-29 09:49:04 +0000
commitf75399dca66c5b13b73dc0bf79c609685c3b05e3 (patch)
tree00fe51a03ced1aee2319508ed384e4fce1901490
parentOnly skip routes with a loopback gateway for network static and connected. (diff)
downloadwireguard-openbsd-f75399dca66c5b13b73dc0bf79c609685c3b05e3.tar.xz
wireguard-openbsd-f75399dca66c5b13b73dc0bf79c609685c3b05e3.zip
getifaddrs() can return entries where ifa_addr is NULL. Check for this
before accessing anything in ifa_addr. OK florian@
-rw-r--r--usr.sbin/bgpd/config.c5
-rw-r--r--usr.sbin/bgpd/session.c16
2 files changed, 13 insertions, 8 deletions
diff --git a/usr.sbin/bgpd/config.c b/usr.sbin/bgpd/config.c
index 6656d5337ab..5cd5a01e188 100644
--- a/usr.sbin/bgpd/config.c
+++ b/usr.sbin/bgpd/config.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: config.c,v 1.95 2020/02/14 13:54:31 claudio Exp $ */
+/* $OpenBSD: config.c,v 1.96 2020/12/29 09:49:04 claudio Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -339,7 +339,8 @@ get_bgpid(void)
fatal("getifaddrs");
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;
cur = ((struct sockaddr_in *)ifa->ifa_addr)->sin_addr.s_addr;
if ((cur & localnet) == localnet) /* skip 127/8 */
diff --git a/usr.sbin/bgpd/session.c b/usr.sbin/bgpd/session.c
index 44c92912c65..2018c45dd1d 100644
--- a/usr.sbin/bgpd/session.c
+++ b/usr.sbin/bgpd/session.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: session.c,v 1.407 2020/12/23 13:20:47 claudio Exp $ */
+/* $OpenBSD: session.c,v 1.408 2020/12/29 09:49:04 claudio Exp $ */
/*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@@ -1232,7 +1232,8 @@ get_alternate_addr(struct sockaddr *sa, struct bgpd_addr *alt)
fatal("getifaddrs");
for (match = ifap; match != NULL; match = match->ifa_next)
- if (sa_cmp(sa, match->ifa_addr) == 0)
+ if (match->ifa_addr != NULL &&
+ sa_cmp(sa, match->ifa_addr) == 0)
break;
if (match == NULL) {
@@ -1243,7 +1244,8 @@ get_alternate_addr(struct sockaddr *sa, struct bgpd_addr *alt)
switch (sa->sa_family) {
case AF_INET6:
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
- if (ifa->ifa_addr->sa_family == AF_INET &&
+ if (ifa->ifa_addr != NULL &&
+ ifa->ifa_addr->sa_family == AF_INET &&
strcmp(ifa->ifa_name, match->ifa_name) == 0) {
sa2addr(ifa->ifa_addr, alt, NULL);
break;
@@ -1252,10 +1254,12 @@ get_alternate_addr(struct sockaddr *sa, struct bgpd_addr *alt)
break;
case AF_INET:
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
- struct sockaddr_in6 *s =
- (struct sockaddr_in6 *)ifa->ifa_addr;
- if (ifa->ifa_addr->sa_family == AF_INET6 &&
+ if (ifa->ifa_addr != NULL &&
+ ifa->ifa_addr->sa_family == AF_INET6 &&
strcmp(ifa->ifa_name, match->ifa_name) == 0) {
+ struct sockaddr_in6 *s =
+ (struct sockaddr_in6 *)ifa->ifa_addr;
+
/* only accept global scope addresses */
if (IN6_IS_ADDR_LINKLOCAL(&s->sin6_addr) ||
IN6_IS_ADDR_SITELOCAL(&s->sin6_addr))