| 1 | --- a/include/linux/skbuff.h |
| 2 | +++ b/include/linux/skbuff.h |
| 3 | @@ -1850,12 +1850,15 @@ static inline int skb_clone_writable(con |
| 4 | static inline int __skb_cow(struct sk_buff *skb, unsigned int headroom, |
| 5 | int cloned) |
| 6 | { |
| 7 | + unsigned int alloc_headroom = headroom; |
| 8 | int delta = 0; |
| 9 | |
| 10 | if (headroom < NET_SKB_PAD) |
| 11 | - headroom = NET_SKB_PAD; |
| 12 | - if (headroom > skb_headroom(skb)) |
| 13 | - delta = headroom - skb_headroom(skb); |
| 14 | + alloc_headroom = NET_SKB_PAD; |
| 15 | + if (headroom > skb_headroom(skb) || |
| 16 | + (cloned && alloc_headroom > skb_headroom(skb))) { |
| 17 | + delta = alloc_headroom - skb_headroom(skb); |
| 18 | + } |
| 19 | |
| 20 | if (delta || cloned) |
| 21 | return pskb_expand_head(skb, ALIGN(delta, NET_SKB_PAD), 0, |
| 22 | |