From: Roy Marples Date: Wed, 27 Jul 2016 08:55:42 +0000 (+0000) Subject: Always check if_addrflags{,6}() error of -1. X-Git-Tag: v6.11.2~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8b5c7a9ab001ef0e8e344f234a6d2784fc0ea231;p=thirdparty%2Fdhcpcd.git Always check if_addrflags{,6}() error of -1. While here, fix compile on OpenBSD. --- diff --git a/if-sun.c b/if-sun.c index a0bcac4e..3ed1cb8b 100644 --- a/if-sun.c +++ b/if-sun.c @@ -1345,6 +1345,8 @@ if_addrflags(const struct ipv4_addr *ia) int flags, aflags; aflags = if_addrflags0(ia->iface->ctx->pf_inet_fd, ia->alias); + if (aflags == -1) + return -1; flags = 0; if (aflags & IFF_DUPLICATE) flags |= IN_IFF_DUPLICATED; diff --git a/ipv4.c b/ipv4.c index a2c5e9e4..8000cd41 100644 --- a/ipv4.c +++ b/ipv4.c @@ -1233,6 +1233,7 @@ ipv4_handleifa(struct dhcpcd_ctx *ctx, struct interface *ifp; struct ipv4_state *state; struct ipv4_addr *ia; + int flags; if (ifs == NULL) ifs = ctx->ifaces; @@ -1270,7 +1271,15 @@ ipv4_handleifa(struct dhcpcd_ctx *ctx, ia->brd = *brd; else ia->brd.s_addr = INADDR_ANY; - ia->addr_flags = if_addrflags(ia); + + flags = if_addrflags(ia); + if (flags == -1) { + logger(ia->iface->ctx, LOG_ERR, + "%s: %s: if_addrflags: %m", + ia->iface->name, ia->saddr); + return; + } + ia->addr_flags = flags; break; case RTM_DELADDR: if (ia == NULL) diff --git a/ipv6.c b/ipv6.c index 988080df..2af84602 100644 --- a/ipv6.c +++ b/ipv6.c @@ -566,22 +566,29 @@ ipv6_userprefix( void ipv6_checkaddrflags(void *arg) { - struct ipv6_addr *ap; + struct ipv6_addr *ia; + int flags; + + ia = arg; + if ((flags = if_addrflags6(ia)) == -1) { + logger(ia->iface->ctx, LOG_ERR, + "%s: if_addrflags6: %m", ia->iface->name); + return; + } - ap = arg; - if (ifa_flags == -1) - logger(ap->iface->ctx, LOG_ERR, - "%s: if_addrflags6: %m", ap->iface->name); - else if (!(ifa_flags & IN6_IFF_TENTATIVE)) { - ipv6_handleifa(ap->iface->ctx, RTM_NEWADDR, - ap->iface->ctx->ifaces, ap->iface->name, - &ap->addr, ap->prefix_len); + ia->addr_flags = flags; + if (!(ia->addr_flags & IN6_IFF_TENTATIVE)) { + /* Simulate the kernel announcing the new address. */ + ipv6_handleifa(ia->iface->ctx, RTM_NEWADDR, + ia->iface->ctx->ifaces, ia->iface->name, + &ia->addr, ia->prefix_len); } else { + /* Still tentative? Check again in a bit. */ struct timespec tv; ms_to_ts(&tv, RETRANS_TIMER / 2); - eloop_timeout_add_tv(ap->iface->ctx->eloop, &tv, - ipv6_checkaddrflags, ap); + eloop_timeout_add_tv(ia->iface->ctx->eloop, &tv, + ipv6_checkaddrflags, ia); } } #endif @@ -1052,6 +1059,7 @@ ipv6_handleifa(struct dhcpcd_ctx *ctx, struct ipv6_state *state; struct ipv6_addr *ia; struct ll_callback *cb; + int flags; #if 0 char dbuf[INET6_ADDRSTRLEN]; @@ -1133,7 +1141,14 @@ ipv6_handleifa(struct dhcpcd_ctx *ctx, ia->acquired = ia->created; TAILQ_INSERT_TAIL(&state->addrs, ia, next); } - ia->addr_flags = if_addrflags6(ia); + flags = if_addrflags6(ia); + if (flags == -1) { + logger(ia->iface->ctx, LOG_ERR, + "%s: %s: if_addrflags6: %m", + ia->iface->name, ia->saddr); + return; + } + ia->addr_flags = flags; #ifdef IPV6_MANAGETEMPADDR if (ia->addr_flags & IN6_IFF_TEMPORARY) ia->flags |= IPV6_AF_TEMPORARY;