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-stable
mailing list