net: Clone skb before setting peeked flag
authorHerbert Xu <herbert@gondor.apana.org.au>
Mon, 13 Jul 2015 08:04:13 +0000 (16:04 +0800)
committerJiri Slaby <jslaby@suse.cz>
Thu, 27 Aug 2015 07:26:59 +0000 (09:26 +0200)
commit339b0b16eddd5ac63419f0176ef95cc3c917b0f9
treeb07a1bd26a02dee78189c9a42ef19c2f8df04f6b
parentd5f8ff935843779207a4100b38b6a43b0bf5cd07
net: Clone skb before setting peeked flag

[ Upstream commit 738ac1ebb96d02e0d23bc320302a6ea94c612dec ]

Shared skbs must not be modified and this is crucial for broadcast
and/or multicast paths where we use it as an optimisation to avoid
unnecessary cloning.

The function skb_recv_datagram breaks this rule by setting peeked
without cloning the skb first.  This causes funky races which leads
to double-free.

This patch fixes this by cloning the skb and replacing the skb
in the list when setting skb->peeked.

Fixes: a59322be07c9 ("[UDP]: Only increment counter on first peek/recv")
Reported-by: Konstantin Khlebnikov <khlebnikov@yandex-team.ru>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
net/core/datagram.c