| From cbd07d5eb034f396a3740c796a9b1160fe4313e6 Mon Sep 17 00:00:00 2001 |
| From: Jarek Poplawski <jarkao2@gmail.com> |
| Date: Sat, 4 Sep 2010 10:34:29 +0000 |
| Subject: [PATCH] gro: Re-fix different skb headrooms |
| |
| commit 64289c8e6851bca0e589e064c9a5c9fbd6ae5dd4 upstream. |
| |
| The patch: "gro: fix different skb headrooms" in its part: |
| "2) allocate a minimal skb for head of frag_list" is buggy. The copied |
| skb has p->data set at the ip header at the moment, and skb_gro_offset |
| is the length of ip + tcp headers. So, after the change the length of |
| mac header is skipped. Later skb_set_mac_header() sets it into the |
| NET_SKB_PAD area (if it's long enough) and ip header is misaligned at |
| NET_SKB_PAD + NET_IP_ALIGN offset. There is no reason to assume the |
| original skb was wrongly allocated, so let's copy it as it was. |
| |
| bugzilla : https://bugzilla.kernel.org/show_bug.cgi?id=16626 |
| fixes commit: 3d3be4333fdf6faa080947b331a6a19bce1a4f57 |
| |
| Reported-by: Plamen Petrov <pvp-lsts@fs.uni-ruse.bg> |
| Signed-off-by: Jarek Poplawski <jarkao2@gmail.com> |
| CC: Eric Dumazet <eric.dumazet@gmail.com> |
| Acked-by: Eric Dumazet <eric.dumazet@gmail.com> |
| Tested-by: Plamen Petrov <pvp-lsts@fs.uni-ruse.bg> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| net/core/skbuff.c | 2 +- |
| 1 files changed, 1 insertions(+), 1 deletions(-) |
| |
| diff --git a/net/core/skbuff.c b/net/core/skbuff.c |
| index c1c86f5..9e7214e 100644 |
| --- a/net/core/skbuff.c |
| +++ b/net/core/skbuff.c |
| @@ -2711,7 +2711,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) |
| } else if (skb_gro_len(p) != pinfo->gso_size) |
| return -E2BIG; |
| |
| - headroom = NET_SKB_PAD + NET_IP_ALIGN; |
| + headroom = skb_headroom(p); |
| nskb = alloc_skb(headroom + skb_gro_offset(p), GFP_ATOMIC); |
| if (unlikely(!nskb)) |
| return -ENOMEM; |
| -- |
| 1.7.0.4 |
| |