Patch "soreuseport: fix mem leak in reuseport_add_sock()" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
soreuseport: fix mem leak in reuseport_add_sock()
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
soreuseport-fix-mem-leak-in-reuseport_add_sock.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Tue Feb 6 12:42:23 PST 2018
From: Eric Dumazet <[email protected]>
Date: Fri, 2 Feb 2018 10:27:27 -0800
Subject: soreuseport: fix mem leak in reuseport_add_sock()
From: Eric Dumazet <[email protected]>
[ Upstream commit 4db428a7c9ab07e08783e0fcdc4ca0f555da0567 ]
reuseport_add_sock() needs to deal with attaching a socket having its own sk_reuseport_cb, after a prior setsockopt(SO_ATTACH_REUSEPORT_?BPF)
Without this fix, not only a WARN_ONCE() was issued, but we were also leaking memory.
Thanks to sysbot and Eric Biggers for providing us nice C repros.
------------[ cut here ]------------ socket already in reuseport group WARNING: CPU: 0 PID: 3496 at net/core/sock_reuseport.c:119 reuseport_add_sock+0x742/0x9b0 net/core/sock_reuseport.c:117 Kernel panic - not syncing: panic_on_warn set ... CPU: 0 PID: 3496 Comm: syzkaller869503 Not tainted 4.15.0-rc6+ #245 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:17 [inline] dump_stack+0x194/0x257 lib/dump_stack.c:53 panic+0x1e4/0x41c kernel/panic.c:183 __warn+0x1dc/0x200 kernel/panic.c:547 report_bug+0x211/0x2d0 lib/bug.c:184 fixup_bug.part.11+0x37/0x80 arch/x86/kernel/traps.c:178 fixup_bug arch/x86/kernel/traps.c:247 [inline] do_error_trap+0x2d7/0x3e0 arch/x86/kernel/traps.c:296 do_invalid_op+0x1b/0x20 arch/x86/kernel/traps.c:315 invalid_op+0x22/0x40 arch/x86/entry/entry_64.S:1079
--- net/core/sock_reuseport.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-)
net/core/sock_reuseport.c +20 -15
@@ -93,6 +93,16 @@ static struct sock_reuseport *reuseport_return more_reuse; } +static void reuseport_free_rcu (struct rcu_head *head) +{ +struct sock_reuseport *reuse; + + reuse = container_of(head, struct sock_reuseport, rcu); +if (reuse->prog) +bpf_prog_destroy (reuse->prog); +kfree (reuse); +} +/** * reuseport_add_sock - Add a socket to the reuseport group of another. * @sk: New socket to add to the group.
@@ -101,7 +111,7 @@ static struct sock_reuseport *reuseport_*/ int reuseport_add_sock (struct sock *sk,struct sock *sk2) { -struct sock_reuseport *reuse; +struct sock_reuseport *old_reuse, *reuse;if (!rcu_access_pointer (sk2->sk_reuseport_cb)) {int err =reuseport_alloc (sk2);
@@ -112,10 +122,13 @@ int reuseport_add_sock(struct sock *sk,spin_lock_bh (&reuseport_lock); reuse =rcu_dereference_protected (sk2->sk_reuseport_cb, -lockdep_is_held (&reuseport_lock)), -WARN_ONCE (rcu_dereference_protected (sk->sk_reuseport_cb, -lockdep_is_held (&reuseport_lock)), -"socket already in reuseport group" ); +lockdep_is_held (&reuseport_lock)); + old_reuse =rcu_dereference_protected (sk->sk_reuseport_cb, +lockdep_is_held (&reuseport_lock)); +if (old_reuse && old_reuse->num_socks !=1 ) { +spin_unlock_bh (&reuseport_lock); +return -EBUSY ; + }if (reuse->num_socks == reuse->max_socks) { reuse =reuseport_grow (reuse);
@@ -133,19 +146,11 @@ int reuseport_add_sock(struct sock *sk,spin_unlock_bh (&reuseport_lock); +if (old_reuse) +call_rcu (&old_reuse->rcu, reuseport_free_rcu);return 0 ; } -static void reuseport_free_rcu (struct rcu_head *head) -{ -struct sock_reuseport *reuse; - - reuse = container_of(head, struct sock_reuseport, rcu); -if (reuse->prog) -bpf_prog_destroy (reuse->prog); -kfree (reuse); -} -void reuseport_detach_sock (struct sock *sk) {struct sock_reuseport *reuse;
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/tcp-release-sk_frag.page-in-tcp_disconnect.patch queue-4.9/net-igmp-add-a-missing-rcu-locking-section.patch queue-4.9/soreuseport-fix-mem-leak-in-reuseport_add_sock.patch