From patchwork Wed Jan 10 13:35:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Xhonneux X-Patchwork-Id: 858256 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="pUZ/ghMz"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zGpQR2YZrz9s7n for ; Wed, 10 Jan 2018 23:35:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755772AbeAJMf5 (ORCPT ); Wed, 10 Jan 2018 07:35:57 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:39388 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751606AbeAJMfy (ORCPT ); Wed, 10 Jan 2018 07:35:54 -0500 Received: by mail-wm0-f67.google.com with SMTP id i11so26710704wmf.4 for ; Wed, 10 Jan 2018 04:35:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=gUTYiP/tTXlEcGp59JHV6h4fRDBZtFqc3Vr3XeQE4i4=; b=pUZ/ghMzMGHeRye1z+DbjhsTe/12m+iexdNaTxoTSjfaDBBhfSchLCF+hGT7tc7JN4 Z4YVVSRwDSe+40bmY9d2SDP5Ms9dpYN8MM/TA6Z8M8wy8BBXhxZ1tplDFGe6OeBB5x7W 2SbKGQBB7ZxhGcLpsE2d7I/PPuxa1fkRQKudAoT0PG7sT7RNhSzHtsJq7KmlkvKIEuPQ HdC407zsCBOURhdfpBZhoVqBQcU6rm/CtbC0DfBD1Y+xc8a3noxQHTRzBLkPDCP/K7aO 3IfM5UePCHBmUp2+X0ezDm2ouCmeOJE9WOU5s26eduspn4dZU292pDQkWKR2OviSDlBC BTjg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=gUTYiP/tTXlEcGp59JHV6h4fRDBZtFqc3Vr3XeQE4i4=; b=WIStYk1HGB894g1dRzAyxZL7xf+Q8vuR9dBSjO4ICQp26toaEkdDJmDn9hhicaA0Aa ytGE+fO1SswXj9jjx8hJa5UbeewwGSNMssVRMpcVmP4g4pg+YrHFXRXi01TXeaLX+mHg Rh1VEyhRypWicXDu1dk8bEBFUzfktoJhPrCFriMyrX5tnyIG8Cvo06RODlYV2uHjnYZC /gbH/eReRpiDvBg7EHtgp2Wk2b66txq5yzCDRqi3aGf8n5Dd2+wIUavCgkh4RrJbjU7e orS0+uJh5nIt6b0FSzmpimmdP7XQwPRjWp/qKlhr0Kk9dbmu39PCg5j6m7k5Jj4549Id i26w== X-Gm-Message-State: AKGB3mKiJ6hMNtm29OOMppgg7jZFQFGKE4FvLptS+Dr3ue6wqEP+6Yg0 Nah8co1Lpaxr5Z7JlviDDJipbw== X-Google-Smtp-Source: ACJfBosFkklK8gwOHar9WmFZIj6BFbwv3HFU0TxeNAVWdcn2+i4M0hfPI0yrxfnNW3/tCa7yyLfjnQ== X-Received: by 10.80.212.9 with SMTP id t9mr25221128edh.28.1515587752635; Wed, 10 Jan 2018 04:35:52 -0800 (PST) Received: from trondheim.voo.be ([2a02:2788:7d4:93c::3]) by smtp.googlemail.com with ESMTPSA id k11sm896931eda.22.2018.01.10.04.35.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Jan 2018 04:35:51 -0800 (PST) From: Mathieu Xhonneux To: netdev@vger.kernel.org Cc: dlebrun@google.com, m.xhonneux@gmail.com Subject: [PATCH net v2] ipv6: sr: fix TLVs not being copied using setsockopt Date: Wed, 10 Jan 2018 13:35:49 +0000 Message-Id: <20180110133549.962-1-m.xhonneux@gmail.com> X-Mailer: git-send-email 2.15.1 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Function ipv6_push_rthdr4 allows to add an IPv6 Segment Routing Header to a socket through setsockopt, but the current implementation doesn't copy possible TLVs at the end of the SRH received from userspace. Therefore, the execution of the following branch if (sr_has_hmac(sr_phdr)) { ... } will never complete since the len and type fields of a possible HMAC TLV are not copied, hence seg6_get_tlv_hmac will return an error, and the HMAC will not be computed. This commit adds a memcpy in case TLVs have been appended to the SRH. Fixes: a149e7c7ce812561f0fdc7a86ddc42f294e5eb3e ("ipv6: sr: add support for SRH injection through setsockopt") Acked-by: David Lebrun Signed-off-by: Mathieu Xhonneux --- net/ipv6/exthdrs.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 83bd75713535..bc68eb661970 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c @@ -925,6 +925,15 @@ static void ipv6_push_rthdr4(struct sk_buff *skb, u8 *proto, sr_phdr->segments[0] = **addr_p; *addr_p = &sr_ihdr->segments[sr_ihdr->segments_left]; + if (sr_ihdr->hdrlen > hops * 2) { + int tlvs_offset, tlvs_length; + + tlvs_offset = (1 + hops * 2) << 3; + tlvs_length = (sr_ihdr->hdrlen - hops * 2) << 3; + memcpy((char *)sr_phdr + tlvs_offset, + (char *)sr_ihdr + tlvs_offset, tlvs_length); + } + #ifdef CONFIG_IPV6_SEG6_HMAC if (sr_has_hmac(sr_phdr)) { struct net *net = NULL;