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@itglobal.com>
MFC after:	1 week
Sponsored by:	Mellanox Technologies
This commit is contained in:
Hans Petter Selasky 2019-12-18 12:06:34 +00:00
parent cc79ea3a26
commit a4c5668d12
2 changed files with 14 additions and 14 deletions

View File

@ -2409,6 +2409,12 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
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;
@ -2463,14 +2469,8 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
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);

View File

@ -2328,6 +2328,12 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *sopt)
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;
@ -2384,14 +2390,8 @@ in6p_leave_group(struct inpcb *inp, struct sockopt *sopt)
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);