diff options
author | 2019-09-03 07:55:07 +0000 | |
---|---|---|
committer | 2019-09-03 07:55:07 +0000 | |
commit | 8c4e2bd52c3e4059ed6e02777cd9b8be11e2c9ac (patch) | |
tree | a61c676fedf2ed9d537aa6b83c3cad59db162591 | |
parent | pcap-filter is now section 7; (diff) | |
download | wireguard-openbsd-8c4e2bd52c3e4059ed6e02777cd9b8be11e2c9ac.tar.xz wireguard-openbsd-8c4e2bd52c3e4059ed6e02777cd9b8be11e2c9ac.zip |
It's perfectly normal for the SIOCGIFFLAGS and SIOCGIFXFLAGS to fail
when an interface is gone. Bubble the error up and let the callers
deal with it instead of exiting.
OK deraadt, benno
-rw-r--r-- | sbin/slaacd/frontend.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/sbin/slaacd/frontend.c b/sbin/slaacd/frontend.c index 4f47ff90271..0c5b28a4fc3 100644 --- a/sbin/slaacd/frontend.c +++ b/sbin/slaacd/frontend.c @@ -1,4 +1,4 @@ -/* $OpenBSD: frontend.c,v 1.27 2019/06/28 13:32:46 deraadt Exp $ */ +/* $OpenBSD: frontend.c,v 1.28 2019/09/03 07:55:07 florian Exp $ */ /* * Copyright (c) 2017 Florian Obser <florian@openbsd.org> @@ -466,8 +466,10 @@ get_flags(char *if_name) struct ifreq ifr; (void) strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - if (ioctl(ioctlsock, SIOCGIFFLAGS, (caddr_t)&ifr) == -1) - fatal("SIOCGIFFLAGS"); + if (ioctl(ioctlsock, SIOCGIFFLAGS, (caddr_t)&ifr) == -1) { + log_warn("SIOCGIFFLAGS"); + return -1; + } return ifr.ifr_flags; } @@ -477,8 +479,10 @@ get_xflags(char *if_name) struct ifreq ifr; (void) strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - if (ioctl(ioctlsock, SIOCGIFXFLAGS, (caddr_t)&ifr) == -1) - fatal("SIOCGIFXFLAGS"); + if (ioctl(ioctlsock, SIOCGIFXFLAGS, (caddr_t)&ifr) == -1) { + log_warn("SIOCGIFXFLAGS"); + return -1; + } return ifr.ifr_flags; } @@ -488,8 +492,9 @@ update_iface(uint32_t if_index, char* if_name) struct imsg_ifinfo imsg_ifinfo; int flags, xflags; - flags = get_flags(if_name); - xflags = get_xflags(if_name); + if ((flags = get_flags(if_name)) == -1 || (xflags = + get_xflags(if_name)) == -1) + return; if (!(xflags & IFXF_AUTOCONF6)) return; @@ -523,7 +528,8 @@ update_autoconf_addresses(uint32_t if_index, char* if_name) time_t t; int xflags; - xflags = get_xflags(if_name); + if ((xflags = get_xflags(if_name)) == -1) + return; if (!(xflags & IFXF_AUTOCONF6)) return; @@ -747,7 +753,7 @@ handle_route_message(struct rt_msghdr *rtm, struct sockaddr **rti_info) &if_index, sizeof(if_index)); } else { xflags = get_xflags(if_name); - if (!(xflags & IFXF_AUTOCONF6)) { + if (xflags == -1 || !(xflags & IFXF_AUTOCONF6)) { log_debug("RTM_IFINFO: %s(%d) no(longer) " "autoconf6", if_name, ifm->ifm_index); if_index = ifm->ifm_index; |