From: Roy Marples Date: Fri, 27 Feb 2015 20:40:17 +0000 (+0000) Subject: Add a helper function to free IPv6 addresses to ensure all X-Git-Tag: v6.8.0~76 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=134277d5e42727bdcd83405e5c2dfaa972870b9e;p=thirdparty%2Fdhcpcd.git Add a helper function to free IPv6 addresses to ensure all timeouts are cleared. --- diff --git a/dhcp6.c b/dhcp6.c index cbd7b8a9..72c9d1d9 100644 --- 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 ed18626b..261097ba 100644 --- 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 815af65c..ab40a119 100644 --- 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)