diff options
author | rwatson <rwatson@FreeBSD.org> | 2009-04-20 22:56:34 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2009-04-20 22:56:34 +0000 |
commit | 6dff27073dd2a25472cdde4ad14416c2251e6202 (patch) | |
tree | 75ff52ff52afc38849d4ee3599a1d81ce9ef64ad | |
parent | 22bdc8dd64339b3690de0df36d39d43406b6c318 (diff) | |
download | FreeBSD-src-6dff27073dd2a25472cdde4ad14416c2251e6202.zip FreeBSD-src-6dff27073dd2a25472cdde4ad14416c2251e6202.tar.gz |
Assert the interface address list lock in IFP_TO_IA6(), as it will
iterate the interface address list. Marginally expand IF_ADDR_LOCK()
coverage in mld6.c to make sure it's held when IFP_TO_IA6() is called.
MFC after: 2 weeks
-rw-r--r-- | sys/netinet6/in6_var.h | 1 | ||||
-rw-r--r-- | sys/netinet6/mld6.c | 6 |
2 files changed, 5 insertions, 2 deletions
diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h index 260e944..a472a24 100644 --- a/sys/netinet6/in6_var.h +++ b/sys/netinet6/in6_var.h @@ -503,6 +503,7 @@ MALLOC_DECLARE(M_IP6MADDR); /* struct in6_ifaddr *ia; */ \ do { \ struct ifaddr *ifa; \ + IF_ADDR_LOCK_ASSERT(ifp); \ TAILQ_FOREACH(ifa, &(ifp)->if_addrhead, ifa_link) { \ if (ifa->ifa_addr->sa_family == AF_INET6) \ break; \ diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c index 29b71be..0d05522 100644 --- a/sys/netinet6/mld6.c +++ b/sys/netinet6/mld6.c @@ -360,9 +360,12 @@ mld6_input(struct mbuf *m, int off) */ timer = ntohs(mldh->mld_maxdelay); + IF_ADDR_LOCK(ifp); IFP_TO_IA6(ifp, ia); - if (ia == NULL) + if (ia == NULL) { + IF_ADDR_UNLOCK(ifp); break; + } /* * XXX: System timer resolution is too low to handle Max @@ -374,7 +377,6 @@ mld6_input(struct mbuf *m, int off) if (timer == 0 && mldh->mld_maxdelay) timer = 1; - IF_ADDR_LOCK(ifp); TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { if (ifma->ifma_addr->sa_family != AF_INET6) continue; |