|
@@ -1632,6 +1632,8 @@ static inline int deliver_skb(struct sk_buff *skb,
|
|
|
struct packet_type *pt_prev,
|
|
|
struct net_device *orig_dev)
|
|
|
{
|
|
|
+ if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
|
|
|
+ return -ENOMEM;
|
|
|
atomic_inc(&skb->users);
|
|
|
return pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
|
|
|
}
|
|
@@ -3262,7 +3264,10 @@ ncls:
|
|
|
}
|
|
|
|
|
|
if (pt_prev) {
|
|
|
- ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
|
|
|
+ if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
|
|
|
+ ret = -ENOMEM;
|
|
|
+ else
|
|
|
+ ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
|
|
|
} else {
|
|
|
atomic_long_inc(&skb->dev->rx_dropped);
|
|
|
kfree_skb(skb);
|