udp: drop head states only when all skb references are gone
authorPaolo Abeni <pabeni@redhat.com>
Wed, 6 Sep 2017 12:44:36 +0000 (14:44 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 8 Sep 2017 03:02:39 +0000 (20:02 -0700)
commitca2c1418efe9f7fe37aa1f355efdf4eb293673ce
treee7a5bc57ec2c26469e03fb850b4aa61af43bbe38
parent5c25f30c93fdc5bf25e62101aeaae7a4f9b421b3
udp: drop head states only when all skb references are gone

After commit 0ddf3fb2c43d ("udp: preserve skb->dst if required
for IP options processing") we clear the skb head state as soon
as the skb carrying them is first processed.

Since the same skb can be processed several times when MSG_PEEK
is used, we can end up lacking the required head states, and
eventually oopsing.

Fix this clearing the skb head state only when processing the
last skb reference.

Reported-by: Eric Dumazet <edumazet@google.com>
Fixes: 0ddf3fb2c43d ("udp: preserve skb->dst if required for IP options processing")
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/core/skbuff.c
net/ipv4/udp.c