]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Always check if_addrflags{,6}() error of -1.
authorRoy Marples <roy@marples.name>
Wed, 27 Jul 2016 08:55:42 +0000 (08:55 +0000)
committerRoy Marples <roy@marples.name>
Wed, 27 Jul 2016 08:55:42 +0000 (08:55 +0000)
While here, fix compile on OpenBSD.

if-sun.c
ipv4.c
ipv6.c

index a0bcac4e67af6f29cf1b6dce506a6a5ff4cbed3c..3ed1cb8b00f173912472a1e86b336c97bbe29e47 100644 (file)
--- 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 a2c5e9e40527fd3581c30dc7aeab24e723924d39..8000cd41a89dd147c1f2bbb3501201755b8e0d52 100644 (file)
--- 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 988080dfe18f255128ddc1d0ba264d9e183f7e3c..2af846021af8b4ca3171bea25df6ca2b3a70f964 100644 (file)
--- 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;