Message ID | 20220216182037.3742-1-eric.dumazet@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | be6b41c15dc09c067492bd23668763f551747e4e |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] ipv6/addrconf: ensure addrconf_verify_rtnl() has completed | expand |
On 2/16/22 11:20 AM, Eric Dumazet wrote: > From: Eric Dumazet <edumazet@google.com> > > Before freeing the hash table in addrconf_exit_net(), > we need to make sure the work queue has completed, > or risk NULL dereference or UAF. > > Thus, use cancel_delayed_work_sync() to enforce this. > We do not hold RTNL in addrconf_exit_net(), making this safe. > > Fixes: 8805d13ff1b2 ("ipv6/addrconf: use one delayed work per netns") > Signed-off-by: Eric Dumazet <edumazet@google.com> > Reported-by: syzbot <syzkaller@googlegroups.com> > --- > net/ipv6/addrconf.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > Reviewed-by: David Ahern <dsahern@kernel.org>
Hello: This patch was applied to netdev/net-next.git (master) by Jakub Kicinski <kuba@kernel.org>: On Wed, 16 Feb 2022 10:20:37 -0800 you wrote: > From: Eric Dumazet <edumazet@google.com> > > Before freeing the hash table in addrconf_exit_net(), > we need to make sure the work queue has completed, > or risk NULL dereference or UAF. > > Thus, use cancel_delayed_work_sync() to enforce this. > We do not hold RTNL in addrconf_exit_net(), making this safe. > > [...] Here is the summary with links: - [net-next] ipv6/addrconf: ensure addrconf_verify_rtnl() has completed https://git.kernel.org/netdev/net-next/c/be6b41c15dc0 You are awesome, thank you!
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 57fbd6f03ff8d118e50d8aa6ea0ab938a1bb3cbc..44e164706340959b85f8f2d5d562caf8e37aea67 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -7187,7 +7187,7 @@ static void __net_exit addrconf_exit_net(struct net *net) kfree(net->ipv6.devconf_all); net->ipv6.devconf_all = NULL; - cancel_delayed_work(&net->ipv6.addr_chk_work); + cancel_delayed_work_sync(&net->ipv6.addr_chk_work); /* * Check hash table, then free it. */