Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp2564227ybl; Sun, 26 Jan 2020 05:39:04 -0800 (PST) X-Google-Smtp-Source: APXvYqxnZWgQZTyOBsRAPc32Zf9zrEcLX6U9/41rZ06uJ8sti28oMLRMfo4tS+H1jx3/YQZZzXzb X-Received: by 2002:a9d:7757:: with SMTP id t23mr9562897otl.315.1580045944709; Sun, 26 Jan 2020 05:39:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580045944; cv=none; d=google.com; s=arc-20160816; b=GhDgwa1ksll1aTwRvuhw8a2I+EK0QkicpsHsAykXEI+nAb066BJoXYGc4wFWrOSK3I TZoHW57z5cNwxIymm/RGkZjiT1ULW3CGd5eKOOr2OE4zVdPkYe4rlF0Lgx+C6KEpRbRB 3PQ8DygqfPn9vX/XRXkIpRHPf1WKHDGVE2k173vYs3oApq3juNulGoJonscOpTH3saDe MWlEsM1wAnbUgUzWLrKdNX2utHRvEgg4OEgOXHb27M9y+M8Iy0vYhcoYsf56raE59336 dsZnKapjC8pNhLoaigEk3TrNR3/LbweqTd3Xwv1RLHnLkHWik6YRXyLXFCoGP2w4WoKO dXDg== 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 :message-id:date:subject:cc:to:from; bh=YtsEKq4EewAYaJUygC0Po8U/drOPf5UIxiFDHiLYmCw=; b=mkqbVUDudcNm5aTNVFaBcLP4F/oqHDXJXUQNogu5uJK6Z724SXWd4U1w8lWJ5kAjPm UaORScvtn2WPB5v3qZ23dUoZqLqS1BWZjqJvJFMAQQeO66KX47g6vvIc8PCAnOoDnSa+ TiL95gNhQndC7H0rE/qEU5HLjRI7kAbvkt0eOyiRBq/f41kxZUrRAZUKTyRE3TQqQqV6 QLSz0BTbTMdqSVcxhRjP02VzmosFhRG4tNwQjAfVabbmexeIb2Qw8NblYnwiulCe8Die duBL4zV9V0mR8MVa+4wibdqEt4S70/pYgiN8NCzWaju8JcKm4L5GjKlQsUbXqOh26Tgh b3Qg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-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 v26si5921951otj.0.2020.01.26.05.38.53; Sun, 26 Jan 2020 05:39:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-crypto-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-crypto-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726275AbgAZNiY (ORCPT + 99 others); Sun, 26 Jan 2020 08:38:24 -0500 Received: from foss.arm.com ([217.140.110.172]:36116 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726761AbgAZNiY (ORCPT ); Sun, 26 Jan 2020 08:38:24 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AFE5431B; Sun, 26 Jan 2020 05:38:23 -0800 (PST) Received: from e110176-lin.benyossef.com (unknown [10.50.4.146]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 548F73F68E; Sun, 26 Jan 2020 05:38:22 -0800 (PST) From: Gilad Ben-Yossef To: Herbert Xu , "David S. Miller" Cc: Ofir Drang , Geert Uytterhoeven , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC] crypto: ccree - protect against short scatterlists Date: Sun, 26 Jan 2020 15:38:05 +0200 Message-Id: <20200126133805.20294-1-gilad@benyossef.com> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org Deal gracefully with the event of being handed a scatterlist which is shorter than expected. This mitigates a crash in some cases of crashes due to attempt to map empty (but not NULL) scatterlists with none zero lengths. This is an interim patch, to help diagnoze the issue, not intended for mainline in its current form as of yet. Signed-off-by: Gilad Ben-Yossef Reported-by: Geert Uytterhoeven --- drivers/crypto/ccree/cc_buffer_mgr.c | 30 +++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/crypto/ccree/cc_buffer_mgr.c b/drivers/crypto/ccree/cc_buffer_mgr.c index a72586eccd81..9667a2630c66 100644 --- a/drivers/crypto/ccree/cc_buffer_mgr.c +++ b/drivers/crypto/ccree/cc_buffer_mgr.c @@ -286,10 +286,32 @@ static void cc_add_sg_entry(struct device *dev, struct buffer_array *sgl_data, sgl_data->num_of_buffers++; } +static unsigned int cc_sg_trunc_len(struct scatterlist *sg, unsigned int len) +{ + unsigned int total; + + if (!len) + return 0; + + for (total = 0; sg; sg = sg_next(sg)) { + total += sg->length; + if (total >= len) { + total = len; + break; + } + } + + return total; +} + static int cc_map_sg(struct device *dev, struct scatterlist *sg, unsigned int nbytes, int direction, u32 *nents, u32 max_sg_nents, u32 *lbytes, u32 *mapped_nents) { + int ret; + + nbytes = cc_sg_trunc_len(sg, nbytes); + if (sg_is_last(sg)) { /* One entry only case -set to DLLI */ if (dma_map_sg(dev, sg, 1, direction) != 1) { @@ -313,12 +335,14 @@ static int cc_map_sg(struct device *dev, struct scatterlist *sg, /* In case of mmu the number of mapped nents might * be changed from the original sgl nents */ - *mapped_nents = dma_map_sg(dev, sg, *nents, direction); - if (*mapped_nents == 0) { + ret = dma_map_sg(dev, sg, *nents, direction); + if (dma_mapping_error(dev, ret)) { *nents = 0; - dev_err(dev, "dma_map_sg() sg buffer failed\n"); + dev_err(dev, "dma_map_sg() sg buffer failed %d\n", ret); return -ENOMEM; } + + *mapped_nents = ret; } return 0; -- 2.23.0