From mboxrd@z Thu Jan 1 00:00:00 1970 From: Patrick McHardy Subject: [SK_BUFF]: Fix missing offset adjustment in skb_copy_expand Date: Sun, 08 Apr 2007 03:47:49 +0200 Message-ID: <461849C5.8000507@trash.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------080909020407010105030200" Cc: Arnaldo Carvalho de Melo , Kernel Netdev Mailing List To: "David S. Miller" Return-path: Received: from stinky.trash.net ([213.144.137.162]:37381 "EHLO stinky.trash.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965393AbXDHBrw (ORCPT ); Sat, 7 Apr 2007 21:47:52 -0400 Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org This is a multi-part message in MIME format. --------------080909020407010105030200 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit --------------080909020407010105030200 Content-Type: text/plain; name="02.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="02.diff" [SK_BUFF]: Fix missing offset adjustment in skb_copy_expand skb_copy_expand changes the headroom, so it needs to adjust the header offsets by the difference between the old and the new value. Signed-off-by: Patrick McHardy --- commit 9cb76fae709a9303777286998baa457b0730a225 tree 2ea619c7daf9c5e6829dad6d502386eb9c922700 parent fb98b03719ad23840ca005edbba3c86ef1e3282c author Patrick McHardy Sun, 08 Apr 2007 03:36:49 +0200 committer Patrick McHardy Sun, 08 Apr 2007 03:36:49 +0200 net/core/skbuff.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5c9ee94..f2cffd4 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -794,7 +794,9 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, */ struct sk_buff *n = alloc_skb(newheadroom + skb->len + newtailroom, gfp_mask); + int oldheadroom = skb_headroom(skb); int head_copy_len, head_copy_off; + int off = 0; if (!n) return NULL; @@ -804,7 +806,7 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, /* Set the tail pointer and length */ skb_put(n, skb->len); - head_copy_len = skb_headroom(skb); + head_copy_len = oldheadroom; head_copy_off = 0; if (newheadroom <= head_copy_len) head_copy_len = newheadroom; @@ -818,6 +820,13 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, copy_skb_header(n, skb); +#ifdef NET_SKBUFF_DATA_USES_OFFSET + off = newheadroom - oldheadroom; +#endif + n->transport_header += off; + n->network_header += off; + n->mac_header += off; + return n; } --------------080909020407010105030200--