mirror of https://gitee.com/openkylin/linux.git
phonet: properly unshare skbs in phonet_rcv()
Ivaylo Dimitrov reported a regression caused by commit 7866a62104
("dev: add per net_device packet type chains").
skb->dev becomes NULL and we crash in __netif_receive_skb_core().
Before above commit, different kind of bugs or corruptions could happen
without major crash.
But the root cause is that phonet_rcv() can queue skb without checking
if skb is shared or not.
Many thanks to Ivaylo Dimitrov for his help, diagnosis and tests.
Reported-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
Tested-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Remi Denis-Courmont <courmisch@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d461873272
commit
7aaed57c5c
|
@ -377,6 +377,10 @@ static int phonet_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||||
struct sockaddr_pn sa;
|
struct sockaddr_pn sa;
|
||||||
u16 len;
|
u16 len;
|
||||||
|
|
||||||
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||||
|
if (!skb)
|
||||||
|
return NET_RX_DROP;
|
||||||
|
|
||||||
/* check we have at least a full Phonet header */
|
/* check we have at least a full Phonet header */
|
||||||
if (!pskb_pull(skb, sizeof(struct phonethdr)))
|
if (!pskb_pull(skb, sizeof(struct phonethdr)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in New Issue