dccp/tcp: do not inherit mc_list from parent
authorEric Dumazet <edumazet@google.com>
Tue, 9 May 2017 13:29:19 +0000 (06:29 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Mon, 26 Jun 2017 15:27:47 +0000 (16:27 +0100)
syzkaller found a way to trigger double frees from ip_mc_drop_socket()

It turns out that leave a copy of parent mc_list at accept() time,
which is very bad.

Very similar to commit 8b485ce69876 ("tcp: do not inherit
fastopen_req from parent")

Initial report from Pray3r, completed by Andrey one.
Thanks a lot to them !

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Pray3r <pray3r.z@gmail.com>
Reported-by: Andrey Konovalov <andreyknvl@google.com>
Tested-by: Andrey Konovalov <andreyknvl@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Gbp-Pq: Topic bugfix/all
Gbp-Pq: Name dccp-tcp-do-not-inherit-mc_list-from-parent.patch

net/ipv4/inet_connection_sock.c

index 61a9deec299332aa431c13ad15197974306ff117..cf3d5674846a422f0a84da0ca50c186b0ebb0764 100644 (file)
@@ -665,6 +665,8 @@ struct sock *inet_csk_clone_lock(const struct sock *sk,
                /* listeners have SOCK_RCU_FREE, not the children */
                sock_reset_flag(newsk, SOCK_RCU_FREE);
 
+               inet_sk(newsk)->mc_list = NULL;
+
                newsk->sk_mark = inet_rsk(req)->ir_mark;
                atomic64_set(&newsk->sk_cookie,
                             atomic64_read(&inet_rsk(req)->ir_cookie));