DragonFlyBSD Kernel Audit
DF-0692 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/netinet6/mld6_var.h b/sys/netinet6/mld6_var.h
--- a/sys/netinet6/mld6_var.h
+++ b/sys/netinet6/mld6_var.h
@@ -51,6 +51,7 @@
 void	mld6_input(struct mbuf *, int);
 void	mld6_start_listening(struct in6_multi *);
 void	mld6_stop_listening(struct in6_multi *);
+extern struct lwkt_token mld6_token;
 void	mld6_fasttimeo(void);
 
 #endif /* _KERNEL */

diff --git a/sys/netinet6/mld6.c b/sys/netinet6/mld6.c
--- a/sys/netinet6/mld6.c
+++ b/sys/netinet6/mld6.c
@@ -107,7 +107,7 @@
 
 static void mld6_sendpkt(struct in6_multi *, int, const struct in6_addr *);
 
-static struct lwkt_token mld6_token = LWKT_TOKEN_INITIALIZER(mp_token);
+struct lwkt_token mld6_token = LWKT_TOKEN_INITIALIZER(mp_token);
 
 
 void

diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -1743,7 +1743,9 @@
 	in6m->in6m_ifp = ifp;
 	in6m->in6m_ifma = ifma;
 	ifma->ifma_protospec = in6m;
+	lwkt_gettoken(&mld6_token);
 	LIST_INSERT_HEAD(&in6_multihead, in6m, in6m_entry);
+	lwkt_reltoken(&mld6_token);
 
 	/*
 	 * Let MLD6 know that we have joined a new IP6 multicast
@@ -1770,9 +1772,11 @@
 		 * that we are leaving the multicast group.
 		 */
 		mld6_stop_listening(in6m);
+		lwkt_gettoken(&mld6_token);
 		ifma->ifma_protospec = NULL;
 		LIST_REMOVE(in6m, in6m_entry);
 		kfree(in6m, M_IPMADDR);
+		lwkt_reltoken(&mld6_token);
 	}
 	/* XXX - should be separate API for when we have an ifma? */
 	if_delmulti(ifma->ifma_ifp, ifma->ifma_addr);