svn commit: r364169 - stable/12/sys/netinet

Alexander Motin mav at FreeBSD.org
Wed Aug 12 16:16:18 UTC 2020


Author: mav
Date: Wed Aug 12 16:16:17 2020
New Revision: 364169
URL: https://svnweb.freebsd.org/changeset/base/364169

Log:
  MFC r356321 (by markj):
  Take the ifnet's address lock in igmp_v3_cancel_link_timers().
  
  inm_rele_locked() may remove the multicast address associated with inm.

Modified:
  stable/12/sys/netinet/igmp.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet/igmp.c
==============================================================================
--- stable/12/sys/netinet/igmp.c	Wed Aug 12 16:08:44 2020	(r364168)
+++ stable/12/sys/netinet/igmp.c	Wed Aug 12 16:16:17 2020	(r364169)
@@ -1986,7 +1986,7 @@ igmp_set_version(struct igmp_ifsoftc *igi, const int v
 static void
 igmp_v3_cancel_link_timers(struct igmp_ifsoftc *igi)
 {
-	struct ifmultiaddr	*ifma;
+	struct ifmultiaddr	*ifma, *ifmatmp;
 	struct ifnet		*ifp;
 	struct in_multi		*inm;
 	struct in_multi_head inm_free_tmp;
@@ -2010,8 +2010,8 @@ igmp_v3_cancel_link_timers(struct igmp_ifsoftc *igi)
 	 * for all memberships scoped to this link.
 	 */
 	ifp = igi->igi_ifp;
-	IF_ADDR_RLOCK(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
+	IF_ADDR_WLOCK(ifp);
+	CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, ifmatmp) {
 		if (ifma->ifma_addr->sa_family != AF_INET ||
 		    ifma->ifma_protospec == NULL)
 			continue;
@@ -2055,7 +2055,7 @@ igmp_v3_cancel_link_timers(struct igmp_ifsoftc *igi)
 		inm->inm_timer = 0;
 		mbufq_drain(&inm->inm_scq);
 	}
-	IF_ADDR_RUNLOCK(ifp);
+	IF_ADDR_WUNLOCK(ifp);
 
 	inm_release_list_deferred(&inm_free_tmp);
 }


More information about the svn-src-all mailing list