svn commit: r356069 - in stable/12/sys: netinet netinet6

Hans Petter Selasky hselasky at FreeBSD.org
Wed Dec 25 09:25:22 UTC 2019


Author: hselasky
Date: Wed Dec 25 09:25:20 2019
New Revision: 356069
URL: https://svnweb.freebsd.org/changeset/base/356069

Log:
  MFC r355881:
  Leave multicast group before reaping and committing state for both
  IPv4 and IPv6.
  
  This fixes a regression issue after r349369. When trying to exit a
  multicast group before closing the socket, a multicast leave packet
  should be sent.
  
  Differential Revision:	https://reviews.freebsd.org/D22848
  PR: 242677
  Reviewed by:	bz (network)
  Tested by:	Aleksandr Fedorov <aleksandr.fedorov at itglobal.com>
  Sponsored by:	Mellanox Technologies

Modified:
  stable/12/sys/netinet/in_mcast.c
  stable/12/sys/netinet6/in6_mcast.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet/in_mcast.c
==============================================================================
--- stable/12/sys/netinet/in_mcast.c	Wed Dec 25 05:51:47 2019	(r356068)
+++ stable/12/sys/netinet/in_mcast.c	Wed Dec 25 09:25:20 2019	(r356069)
@@ -2401,6 +2401,12 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sop
 	if (is_final) {
 		ip_mfilter_remove(&imo->imo_head, imf);
 		imf_leave(imf);
+
+		/*
+		 * Give up the multicast address record to which
+		 * the membership points.
+		 */
+		(void) in_leavegroup_locked(imf->imf_inm, imf);
 	} else {
 		if (imf->imf_st[0] == MCAST_EXCLUDE) {
 			error = EADDRNOTAVAIL;
@@ -2455,14 +2461,8 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sop
 out_inp_locked:
 	INP_WUNLOCK(inp);
 
-	if (is_final && imf) {
-		/*
-		 * Give up the multicast address record to which
-		 * the membership points.
-		 */
-		(void) in_leavegroup_locked(imf->imf_inm, imf);
+	if (is_final && imf)
 		ip_mfilter_free(imf);
-	}
 
 	IN_MULTI_UNLOCK();
 	return (error);

Modified: stable/12/sys/netinet6/in6_mcast.c
==============================================================================
--- stable/12/sys/netinet6/in6_mcast.c	Wed Dec 25 05:51:47 2019	(r356068)
+++ stable/12/sys/netinet6/in6_mcast.c	Wed Dec 25 09:25:20 2019	(r356069)
@@ -2326,6 +2326,12 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *so
 	if (is_final) {
 		ip6_mfilter_remove(&imo->im6o_head, imf);
 		im6f_leave(imf);
+
+		/*
+		 * Give up the multicast address record to which
+		 * the membership points.
+		 */
+		(void)in6_leavegroup_locked(inm, imf);
 	} else {
 		if (imf->im6f_st[0] == MCAST_EXCLUDE) {
 			error = EADDRNOTAVAIL;
@@ -2382,14 +2388,8 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *so
 out_in6p_locked:
 	INP_WUNLOCK(inp);
 
-	if (is_final && imf) {
-		/*
-		 * Give up the multicast address record to which
-		 * the membership points.
-		 */
-		(void)in6_leavegroup_locked(inm, imf);
+	if (is_final && imf)
 		ip6_mfilter_free(imf);
-	}
 
 	IN6_MULTI_UNLOCK();
 	return (error);


More information about the svn-src-all mailing list