From patchwork Sun Jan 18 05:48:13 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 19158 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 69BBEDE06E for ; Sun, 18 Jan 2009 16:48:21 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753353AbZARFsQ (ORCPT ); Sun, 18 Jan 2009 00:48:16 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753281AbZARFsQ (ORCPT ); Sun, 18 Jan 2009 00:48:16 -0500 Received: from rhun.apana.org.au ([64.62.148.172]:56416 "EHLO arnor.apana.org.au" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753243AbZARFsP (ORCPT ); Sun, 18 Jan 2009 00:48:15 -0500 Received: from gondolin.me.apana.org.au ([192.168.0.6]) by arnor.apana.org.au with esmtp (Exim 4.63 #1 (Debian)) id 1LOQW6-0006k9-Au; Sun, 18 Jan 2009 16:48:14 +1100 Received: from herbert by gondolin.me.apana.org.au with local (Exim 4.69) (envelope-from ) id 1LOQW5-0006Ux-QK; Sun, 18 Jan 2009 16:48:13 +1100 Date: Sun, 18 Jan 2009 16:48:13 +1100 From: Herbert Xu To: "David S. Miller" , netdev@vger.kernel.org Subject: [3/3] gro: Fix merging of paged packets Message-ID: <20090118054813.GB24943@gondor.apana.org.au> References: <20090118054616.GA24899@gondor.apana.org.au> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20090118054616.GA24899@gondor.apana.org.au> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The third fixes a serious bug in a previous bug fix. gro: Fix merging of paged packets The previous fix to paged packets broke the merging because it reset the skb->len before we added it to the merged packet. This wasn't detected because it simply resulted in the truncation of the packet while the missing bit is subsequently retransmitted. The fix is to store skb->len before we clobber it. Signed-off-by: Herbert Xu Cheers, diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 65eac77..9127c47 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2588,8 +2588,9 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) struct sk_buff *nskb; unsigned int headroom; unsigned int hlen = p->data - skb_mac_header(p); + unsigned int len = skb->len; - if (hlen + p->len + skb->len >= 65536) + if (hlen + p->len + len >= 65536) return -E2BIG; if (skb_shinfo(p)->frag_list) @@ -2651,9 +2652,9 @@ merge: done: NAPI_GRO_CB(p)->count++; - p->data_len += skb->len; - p->truesize += skb->len; - p->len += skb->len; + p->data_len += len; + p->truesize += len; + p->len += len; NAPI_GRO_CB(skb)->same_flow = 1; return 0;