]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Add a helper function to free IPv6 addresses to ensure all
authorRoy Marples <roy@marples.name>
Fri, 27 Feb 2015 20:40:17 +0000 (20:40 +0000)
committerRoy Marples <roy@marples.name>
Fri, 27 Feb 2015 20:40:17 +0000 (20:40 +0000)
timeouts are cleared.

dhcp6.c
ipv6.c
ipv6.h

diff --git a/dhcp6.c b/dhcp6.c
index cbd7b8a976be713f6a167ee80d7075d16bb7df9d..72c9d1d99fb85aa4c7854a8365093d7560295b60 100644 (file)
--- a/dhcp6.c
+++ b/dhcp6.c
@@ -2034,9 +2034,7 @@ dhcp6_findia(struct interface *ifp, const struct dhcp6_message *m, size_t l,
        }
        TAILQ_FOREACH_SAFE(ap, &state->addrs, next, nap) {
                if (ap->flags & IPV6_AF_STALE) {
-                       if (ap->dadcallback)
-                               eloop_q_timeout_delete(ap->iface->ctx->eloop,
-                                   0, NULL, ap);
+                       eloop_q_timeout_delete(ifp->ctx->eloop, 0, NULL, ap);
                        if (ap->flags & IPV6_AF_REQUEST) {
                                ap->prefix_vltime = ap->prefix_pltime = 0;
                        } else {
@@ -2308,7 +2306,7 @@ dhcp6_ifdelegateaddr(struct interface *ifp, struct ipv6_addr *prefix,
                        a->flags |= ap->flags;
                        a->flags &= ~IPV6_AF_NEW;
                        a->created = ap->created;
-                       free(ap);
+                       ipv6_freeaddr(ap);
                }
        }
 
diff --git a/ipv6.c b/ipv6.c
index ed18626b9200ac16a5b0d2e1751a8fef7db0eb82..261097ba531fd3e5444d770ee52da83e12b3011d 100644 (file)
--- a/ipv6.c
+++ b/ipv6.c
@@ -620,9 +620,7 @@ ipv6_deleteaddr(struct ipv6_addr *addr)
        TAILQ_FOREACH(ap, &state->addrs, next) {
                if (IN6_ARE_ADDR_EQUAL(&ap->addr, &addr->addr)) {
                        TAILQ_REMOVE(&state->addrs, ap, next);
-                       eloop_q_timeout_delete(addr->iface->ctx->eloop, 0,
-                           NULL, ap);
-                       free(ap);
+                       ipv6_freeaddr(ap);
                        break;
                }
        }
@@ -784,7 +782,7 @@ ipv6_addaddrs(struct ipv6_addrhead *addrs)
                                ap->flags &= ~IPV6_AF_ADDED;
                        } else {
                                TAILQ_REMOVE(addrs, ap, next);
-                               free(ap);
+                               ipv6_freeaddr(ap);
                        }
                } else if (!(ap->flags & IPV6_AF_STALE) &&
                    !IN6_IS_ADDR_UNSPECIFIED(&ap->addr))
@@ -825,6 +823,14 @@ ipv6_addaddrs(struct ipv6_addrhead *addrs)
        return i;
 }
 
+void
+ipv6_freeaddr(struct ipv6_addr *ap)
+{
+
+       eloop_q_timeout_delete(ap->iface->ctx->eloop, 0, NULL, ap);
+       free(ap);
+}
+
 void
 ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
     const struct interface *ifd)
@@ -838,7 +844,6 @@ ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
                        continue;
                if (drop != 2)
                        TAILQ_REMOVE(addrs, ap, next);
-               eloop_q_timeout_delete(ap->iface->ctx->eloop, 0, NULL, ap);
                if (drop && ap->flags & IPV6_AF_ADDED &&
                    (ap->iface->options->options &
                    (DHCPCD_EXITING | DHCPCD_PERSISTENT)) !=
@@ -860,10 +865,10 @@ ipv6_freedrop_addrs(struct ipv6_addrhead *addrs, int drop,
                                ipv6_addaddr(apf, &now);
                        }
                        if (drop == 2)
-                               free(ap);
+                               ipv6_freeaddr(ap);
                }
                if (drop != 2)
-                       free(ap);
+                       ipv6_freeaddr(ap);
        }
 }
 
@@ -938,8 +943,7 @@ ipv6_handleifa(struct dhcpcd_ctx *ctx,
                case RTM_DELADDR:
                        if (ap) {
                                TAILQ_REMOVE(&state->addrs, ap, next);
-                               eloop_q_timeout_delete(ctx->eloop, 0, NULL, ap);
-                               free(ap);
+                               ipv6_freeaddr(ap);
                        }
                        break;
                case RTM_NEWADDR:
diff --git a/ipv6.h b/ipv6.h
index 815af65cf64f61d297e52cdeb919cef737c76993..ab40a1199ca124d5db7bc820b19cca4434c540a3 100644 (file)
--- a/ipv6.h
+++ b/ipv6.h
@@ -252,6 +252,7 @@ struct ipv6_addr *ipv6_findaddr(struct dhcpcd_ctx *,
     const struct in6_addr *, short);
 #define ipv6_linklocal(ifp) ipv6_iffindaddr((ifp), NULL)
 int ipv6_addlinklocalcallback(struct interface *, void (*)(void *), void *);
+void ipv6_freeaddr(struct ipv6_addr *);
 void ipv6_freedrop(struct interface *, int);
 #define ipv6_free(ifp) ipv6_freedrop((ifp), 0)
 #define ipv6_drop(ifp) ipv6_freedrop((ifp), 2)