summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2009-04-20 22:56:34 +0000
committerrwatson <rwatson@FreeBSD.org>2009-04-20 22:56:34 +0000
commit6dff27073dd2a25472cdde4ad14416c2251e6202 (patch)
tree75ff52ff52afc38849d4ee3599a1d81ce9ef64ad
parent22bdc8dd64339b3690de0df36d39d43406b6c318 (diff)
downloadFreeBSD-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.h1
-rw-r--r--sys/netinet6/mld6.c6
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;
OpenPOWER on IntegriCloud