From patchwork Wed Jan 16 22:47:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain KUNTZ X-Patchwork-Id: 213085 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.180.67]) by ozlabs.org (Postfix) with ESMTP id 897652C0093 for ; Thu, 17 Jan 2013 09:48:03 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757947Ab3APWrq (ORCPT ); Wed, 16 Jan 2013 17:47:46 -0500 Received: from mail-wi0-f180.google.com ([209.85.212.180]:60585 "EHLO mail-wi0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757691Ab3APWrp convert rfc822-to-8bit (ORCPT ); Wed, 16 Jan 2013 17:47:45 -0500 Received: by mail-wi0-f180.google.com with SMTP id hj13so1764814wib.7 for ; Wed, 16 Jan 2013 14:47:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ipflavors.com; s=google; h=x-received:from:content-type:content-transfer-encoding:subject:date :message-id:cc:to:mime-version:x-mailer; bh=UMaK9aL8fpHraCqwbZ/FDID0qwf4zNNKqPeAU3jv52s=; b=d/PrJaChfDN7TcVA0RKkeAFogCS/+GaMzD+uaVbqkFAP7oEMKlPwuQqYH8xeZkc4ys 442dO+Pd3gvSvMnW1LwdosTbZ98zO6afadADtSCVpUS841ZiS2N/H+DXdYCGsWqs3O7r 2pc8eJ/Evv6653oPQvvCDXZVM40qlRbb3VAE8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:content-type:content-transfer-encoding:subject:date :message-id:cc:to:mime-version:x-mailer:x-gm-message-state; bh=UMaK9aL8fpHraCqwbZ/FDID0qwf4zNNKqPeAU3jv52s=; b=A8uXDenIWj1PNIAIcx/Hf2q7fvfdO10L/X/b8EE4h5yVQfrKw9iMGprMIhHT3lN02T nKpg60hK1KNjiYiVBxWAaGAKo8xJ/bA/ySGK8y+as/5Q2rAB6YtDb88t8zUaRzbbNNUZ ea4VX1Usq7+9Fw0f1d2w4DeM9FAUbaRZQZzOG5iyk1jC5wgElmJvnaLqBFLypNVeUxkX o4RC1MVepmaPBz1U4dAQYqUgeOQf/XfEHCoDVIWXnmhOe6C3898qTQVCtjiYq5hFs4Wd iPO9Mi7/5XGhvzYuTAuEnUw9UBEzlNRyEn48douSkDQsXEWpxLRahxmnwMlW712w99o0 TtYA== X-Received: by 10.180.95.228 with SMTP id dn4mr4920380wib.16.1358376463728; Wed, 16 Jan 2013 14:47:43 -0800 (PST) Received: from [192.168.1.30] (bro67-1-87-91-122-114.dsl.sta.abo.bbox.fr. [87.91.122.114]) by mx.google.com with ESMTPS id hu8sm10433785wib.6.2013.01.16.14.47.41 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 16 Jan 2013 14:47:42 -0800 (PST) From: Romain KUNTZ Subject: [PATCH 1/1] ipv6: fix header length calculation in ip6_append_data() Date: Wed, 16 Jan 2013 23:47:40 +0100 Message-Id: Cc: "yoshfuji@linux-ipv6.org Hideaki" , "davem@davemloft.net" , Steffen Klassert , "linux-kernel@vger.kernel.org" , Romain KUNTZ To: "netdev@vger.kernel.org" Mime-Version: 1.0 (Mac OS X Mail 6.2 \(1499\)) X-Mailer: Apple Mail (2.1499) X-Gm-Message-State: ALoCoQnDjZsv5jYZgesMgHo1BG8T2+2ymXelVFiYIv9nxCiUDb3nDvChfcO4I8UMOtp1/kL/dzom Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Commit 299b0767 (ipv6: Fix IPsec slowpath fragmentation problem) has introduced a error in the header length calculation that provokes corrupted packets when non-fragmentable extensions headers (Destination Option or Routing Header Type 2) are used. rt->rt6i_nfheader_len is the length of the non-fragmentable extension header, and it should be substracted to rt->dst.header_len, and not to exthdrlen, as it was done before commit 299b0767. This patch reverts to the original and correct behavior. It has been successfully tested with and without IPsec on packets that include non-fragmentable extensions headers. Signed-off-by: Romain Kuntz Acked-by: Steffen Klassert --- net/ipv6/ip6_output.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 5552d13..0c7c03d 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -1213,10 +1213,10 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, if (dst_allfrag(rt->dst.path)) cork->flags |= IPCORK_ALLFRAG; cork->length = 0; - exthdrlen = (opt ? opt->opt_flen : 0) - rt->rt6i_nfheader_len; + exthdrlen = (opt ? opt->opt_flen : 0); length += exthdrlen; transhdrlen += exthdrlen; - dst_exthdrlen = rt->dst.header_len; + dst_exthdrlen = rt->dst.header_len - rt->rt6i_nfheader_len; } else { rt = (struct rt6_info *)cork->dst; fl6 = &inet->cork.fl.u.ip6;