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:
parent
c4dd3fe108
commit
93c83dd8bf
@ -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; \
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user