Message ID | 20220429162036.2226133-1-eric.dumazet@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | a9384a4c1d250cb40cebf50e41459426d160b08e |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] mld: respect RCU rules in ip6_mc_source() and ip6_mc_msfilter() | expand |
Hello: This patch was applied to netdev/net.git (master) by David S. Miller <davem@davemloft.net>: On Fri, 29 Apr 2022 09:20:36 -0700 you wrote: > From: Eric Dumazet <edumazet@google.com> > > Whenever RCU protected list replaces an object, > the pointer to the new object needs to be updated > _before_ the call to kfree_rcu() or call_rcu() > > Also ip6_mc_msfilter() needs to update the pointer > before releasing the mc_lock mutex. > > [...] Here is the summary with links: - [net] mld: respect RCU rules in ip6_mc_source() and ip6_mc_msfilter() https://git.kernel.org/netdev/net/c/a9384a4c1d25 You are awesome, thank you!
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 909f937befd71fce194517d44cb9a4c5e2876360..7f695c39d9a8c4410e619b88add23e39f2beabae 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c @@ -460,10 +460,10 @@ int ip6_mc_source(int add, int omode, struct sock *sk, newpsl->sl_addr[i] = psl->sl_addr[i]; atomic_sub(struct_size(psl, sl_addr, psl->sl_max), &sk->sk_omem_alloc); - kfree_rcu(psl, rcu); } + rcu_assign_pointer(pmc->sflist, newpsl); + kfree_rcu(psl, rcu); psl = newpsl; - rcu_assign_pointer(pmc->sflist, psl); } rv = 1; /* > 0 for insert logic below if sl_count is 0 */ for (i = 0; i < psl->sl_count; i++) { @@ -565,12 +565,12 @@ int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf, psl->sl_count, psl->sl_addr, 0); atomic_sub(struct_size(psl, sl_addr, psl->sl_max), &sk->sk_omem_alloc); - kfree_rcu(psl, rcu); } else { ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); } - mutex_unlock(&idev->mc_lock); rcu_assign_pointer(pmc->sflist, newpsl); + mutex_unlock(&idev->mc_lock); + kfree_rcu(psl, rcu); pmc->sfmode = gsf->gf_fmode; err = 0; done: