Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp336714yba; Sat, 4 May 2019 03:30:23 -0700 (PDT) X-Google-Smtp-Source: APXvYqyVOX3C9HUn29bVRrA/uk5/xGpayi+1Jnh+g5ljmsbQQrv9GC/Pwm7BZu1p3yYK9uaBPe3P X-Received: by 2002:a62:2506:: with SMTP id l6mr2402349pfl.250.1556965823165; Sat, 04 May 2019 03:30:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1556965823; cv=none; d=google.com; s=arc-20160816; b=R7mwv784tq9ZShSDygBZhOH4w55X/N47w+1Q3IpCYJ+sWxId6+ibcn5SwaaFmUxu9m kVy7rZPGb3WUVjcMnk0WRrDahXYNNWV97GDeRok8j9n0RBIzM4jStAYgBbRigIMbg3W9 v1NzZLwiWgMxbA7PStDfoLTcumt6M7YI3kX0cILz78VWaSwLbGxSuP7V7SB2Fz8LzzFY 33AVxywHwz49XudW4cdFBbFhPQ6St4rk67lSlyffoQCatK9Mv6+An9QakicvPR7mIrDW J9CdadIgyFNzpTblp/Utz3kIKc2WZPyv1d6sywa147DopN6KXuUcj46blAJQXon9GPSI q4Nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=ElyvfxI6wexdc1ragNY1I39rUZHvgB6ipKFzetyg02g=; b=XOz0raIIQ85BrI+s4p/Bxh8OtOsbJk+xF1P3qxp0R5ntx7Nl058ktOw/B4kWATREj/ ZxvmhnXIt5PeLnsknd1YOPNqWlrOx2N93TOvK/9gdYTh2sNwutv050MaBr/Z8wkJeIyl +9u2kvmuCTP2tjCwT5C/zQY6eDTierKxllXLShU7qO8GzKgNg87/J5iJByhSvs2SHfLZ qVleOJB2x/bUd+ACObgItIOZX6PKZHnVany5rwC4fitrmgxKuRjgBSqreRasdpR2OP8p M7WbyceiA5Ihw1sj6hRDGX4ycUwiBClvPwwtF/aZJxbsFT8aBb2Za8G1Q0gklZKybJhC lyrw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=eXgeNYmK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id q135si6299179pgq.429.2019.05.04.03.30.07; Sat, 04 May 2019 03:30:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=eXgeNYmK; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728196AbfEDK1c (ORCPT + 99 others); Sat, 4 May 2019 06:27:32 -0400 Received: from mail.kernel.org ([198.145.29.99]:37666 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728188AbfEDK13 (ORCPT ); Sat, 4 May 2019 06:27:29 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9885F206BB; Sat, 4 May 2019 10:27:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1556965648; bh=BWFpvBSdMj8bWjVZXoTbFZTlv7FHBpF4S9q60QRo7h8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eXgeNYmK1SidtSHLdoAYl0a0MKVxv7S7QOko7XQFmSGPl0DlJzPXWhrweNFRn7Gq1 2GCMUkoxGBd78ocJhG37WkqkgKsUnRcJInyEqdxh640x6FKMtbfskFJAze4XKImscr O4Y3VympAzc6FslKUxqXK9oz1SVzzTqic+TbyJzw= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jakub Kicinski , John Hurley , "David S. Miller" Subject: [PATCH 4.19 19/23] net/tls: fix copy to fragments in reencrypt Date: Sat, 4 May 2019 12:25:21 +0200 Message-Id: <20190504102452.152806399@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190504102451.512405835@linuxfoundation.org> References: <20190504102451.512405835@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jakub Kicinski [ Upstream commit eb3d38d5adb520435d4e4af32529ccb13ccc9935 ] Fragments may contain data from other records so we have to account for that when we calculate the destination and max length of copy we can perform. Note that 'offset' is the offset within the message, so it can't be passed as offset within the frag.. Here skb_store_bits() would have realised the call is wrong and simply not copy data. Fixes: 4799ac81e52a ("tls: Add rx inline crypto offload") Signed-off-by: Jakub Kicinski Reviewed-by: John Hurley Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/tls/tls_device.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -569,7 +569,7 @@ void handle_device_resync(struct sock *s static int tls_device_reencrypt(struct sock *sk, struct sk_buff *skb) { struct strp_msg *rxm = strp_msg(skb); - int err = 0, offset = rxm->offset, copy, nsg; + int err = 0, offset = rxm->offset, copy, nsg, data_len, pos; struct sk_buff *skb_iter, *unused; struct scatterlist sg[1]; char *orig_buf, *buf; @@ -600,9 +600,10 @@ static int tls_device_reencrypt(struct s else err = 0; + data_len = rxm->full_len - TLS_CIPHER_AES_GCM_128_TAG_SIZE; + if (skb_pagelen(skb) > offset) { - copy = min_t(int, skb_pagelen(skb) - offset, - rxm->full_len - TLS_CIPHER_AES_GCM_128_TAG_SIZE); + copy = min_t(int, skb_pagelen(skb) - offset, data_len); if (skb->decrypted) skb_store_bits(skb, offset, buf, copy); @@ -611,16 +612,30 @@ static int tls_device_reencrypt(struct s buf += copy; } + pos = skb_pagelen(skb); skb_walk_frags(skb, skb_iter) { - copy = min_t(int, skb_iter->len, - rxm->full_len - offset + rxm->offset - - TLS_CIPHER_AES_GCM_128_TAG_SIZE); + int frag_pos; + + /* Practically all frags must belong to msg if reencrypt + * is needed with current strparser and coalescing logic, + * but strparser may "get optimized", so let's be safe. + */ + if (pos + skb_iter->len <= offset) + goto done_with_frag; + if (pos >= data_len + rxm->offset) + break; + + frag_pos = offset - pos; + copy = min_t(int, skb_iter->len - frag_pos, + data_len + rxm->offset - offset); if (skb_iter->decrypted) - skb_store_bits(skb_iter, offset, buf, copy); + skb_store_bits(skb_iter, frag_pos, buf, copy); offset += copy; buf += copy; +done_with_frag: + pos += skb_iter->len; } free_buf: