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
This commit is contained in:
Robert Watson 2009-04-20 22:56:34 +00:00
parent c4dd3fe108
commit 93c83dd8bf
2 changed files with 5 additions and 2 deletions

View File

@ -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; \

View File

@ -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;