From patchwork Sun Aug 1 13:19:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Len Baker X-Patchwork-Id: 12412941 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3F101C4338F for ; Sun, 1 Aug 2021 13:22:41 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 004C660F70 for ; Sun, 1 Aug 2021 13:22:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 004C660F70 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmx.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=oBsnJYZcoMeFZ1Tf1bkNIpKcy2z07yGgXjqK+rQqUAM=; b=dX1qD4v2lnSAUv buGuUQDMfDwcUO1RVE05svXjqWP93IYaIIWbqC/LgpE9elHQQrtYR57ULBFc1yQyFFhNVkxPCxCvs nXlFMLzYZxBy8qpdVUFU6H06enD8NSb8g0JZTUis1p5mjlppXik6xdIfL6OMT18HcgL56cNtM7zw4 2DOvrobRA44/UkhLcUGQwO1oTqpnzp+FF3PkJPzbNNmKeAElpVqcNhUHalL34PsKHetmgZ0LZIJGx N51Z2/gkg/zusXsSCx9HCpqRYm6zhU9+HcAQf8wDBIy5AJVajDVxGpZnILXzQYzPEltUb4RmJJBNu qRp8qlj5ChTQ7cz4Dh9Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mABOE-00DbAi-SV; Sun, 01 Aug 2021 13:20:27 +0000 Received: from mout.gmx.net ([212.227.17.20]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mABO9-00DbAE-Td for linux-arm-kernel@lists.infradead.org; Sun, 01 Aug 2021 13:20:24 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1627824010; bh=12SUoHSYDBGt1hC0+tZ7it98pstpvxoKbmEjS94qv3o=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=lnv9cpDmbWbObk5BKhnhxKT1k6FY51TfDWW+t3b5wAYUBrCbhuuiNaLEzbeEhSR6A JdSWwNNxLmc+yQgI6TbCqDG075Bz9D7oDNwulCR75n3VuDjtV5TsRnedOXhUjtrA6O l47Di6Ozolbh6FLZymovj20Q3eWaTD6ymCD0q6sY= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from localhost.localdomain ([79.150.72.99]) by mail.gmx.net (mrgmx104 [212.227.17.174]) with ESMTPSA (Nemesis) id 1M4Jqb-1mASMt1q9B-000O93; Sun, 01 Aug 2021 15:20:10 +0200 From: Len Baker To: Kees Cook , Andy Gross , Bjorn Andersson , Geert Uytterhoeven , Magnus Damm , Santosh Shilimkar Cc: Len Baker , David Laight , Robin Murphy , linux-hardening@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v3] drivers/soc: Remove all strcpy() uses Date: Sun, 1 Aug 2021 15:19:58 +0200 Message-Id: <20210801131958.6144-1-len.baker@gmx.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Provags-ID: V03:K1:tTfcHuj+0ypGvbZo0LvioO/mi5Bv/AvCw96dIoajsIs0ln+YTgJ 4k4S2nXfLuvErUmUBcMQHslsS2xRPF7StmHDcwaK5CIq3yP2QrYx6uiyLlZfsPpJgXC9W6P Lxvg5gzdmpkeP/ghkUYLshN6HtiFfpEwoZrY036JZOwqEHr0mkL9QHNJGVIhg9cSuTt39mH QPkaW6A3ZdeqLhxbf5z6w== X-UI-Out-Filterresults: notjunk:1;V03:K0:VosoT9dYQXM=:xIei2A0P1I+zYyhjQMM/Gr SMQlJ0psogAioUEsUwAS1ydrMrFJUL+nJrMhTabj6e9keRrsToqxHcvy/vWOrqpUHxsfbrC2Z 0DCZZTfUR9+uH1LiW7YPbcOuhVM4n2rp8NpkL3wu87E6g9Wbce65bHHv6zhQ8g5UzLrX7T2MW 85j7M+Gm/z5MstxUPUt4TQClwz4PH1ADmyIFSCdbFoeMVjCiOg/6HcBzjL4o401IwnQA2oDu/ 6FmVQoZPHlgqVyOrLo7alwrox//RwwjnMQRaQeZEq4TagzJZ+lJQrI72aDdoGjuy9RmRNir+J EPjR0uZEDyYRVsWfN6Rkju294FSz4/bsPeYNSkol6sOS5WTDkmJVBEymMcQWk1nqZLkDyNqMV G90UkFmU1PBy+/OxaDk1WqCO67WoLWbtLljzQhMHTxI3vkL6Qg8Pji5Mf4Wi/0jhKMEm4wWSl WJAs93F+xuv50DpZQEqZk5Ekc+RiCGv7TcdmtuoxEAnTOQ61u6OAYZcInQ7ETWDWPkozq5O5g OzkQCLhNfzcm9ZVm9EMc9tK6QF2NO3EuO7S1WIb4F0fR0XB9QJnJP3Zoq+IIiqiI6xOKU1d2w R4jEM/QBhSPaa/cHu7Y/d3JBcsJHt4c0xZFlfiEBCEqO8X1CRLf44sNr32vKFHWA6xAa6c4Kd M4tuhXWPA0LIoPR4g4zA0yGqbKKtk0dgQjf2Bw6vY1UpRx+laZSK1jIog/EJ7Bbq75BSga4iP 2KmOIdoIrhaMaewlhXaUoG17a5qH/sO4Qm/SmStvH0X3QHKL4T5pgtZp7SYS0J0uHybhYS5ik 6y69+FDelZ2ePEbMPPFJBuWSCYqYvq+uYwpn9OpVkh1D2XXxf8KOrLMFDXgtEFsSq3noqSbKI 8lvugCWBeVnNTfP5CVcZmXqn3WazJinvKWm13f/zDNbWaW7VmtDoUsc4mgnR+CL1sKZBrGdpU MdK9qsyajaJLoHPRoIJiMD9NHs8HRgRxPObVimtkGAfLxV9hZBb/5CYuqvFdf6sBGiAt9OcZx O+kNIUw63rqImi99JsWo08JixFQRQgGfKUMCutaS+O0I/xl3kfoktMzWasYrfBEEXKKiRy+9l UXdQAgc3JpEnuRoOSVYpSdrIJkrG5lOLZ4a X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210801_062022_343451_9B8F6879 X-CRM114-Status: GOOD ( 15.39 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org strcpy() performs no bounds checking on the destination buffer. This could result in linear overflows beyond the end of the buffer, leading to all kinds of misbehaviors. The safe replacement is strscpy(). Moreover, when the size of the destination buffer cannot be obtained using "sizeof", use the memcpy function instead of strscpy. Signed-off-by: Len Baker --- This is a task of the KSPP [1] [1] https://github.com/KSPP/linux/issues/88 Changelog v1 -> v2 - Change the "area_name_size" variable for a shorter name (Geert Uytterhoeven). - Add the "Reviewed-by: Geert Uytterhoeven" tag. - Use the memcpy function instead of strscpy function when the size of the destination buffer cannot be obtained with "sizeof" (David Laight, Robin Murphy). Changelog v2 -> v3 - Remove the "Reviewed-by: Geert Uytterhoeven" tag since the code has changed after the v1 review (use of memcpy instead of strscpy). drivers/soc/qcom/pdr_interface.c | 13 +++++++------ drivers/soc/renesas/r8a779a0-sysc.c | 6 ++++-- drivers/soc/renesas/rcar-sysc.c | 6 ++++-- drivers/soc/ti/knav_dma.c | 2 +- 4 files changed, 16 insertions(+), 11 deletions(-) -- 2.25.1 diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c index 915d5bc3d46e..cf119fde749d 100644 --- a/drivers/soc/qcom/pdr_interface.c +++ b/drivers/soc/qcom/pdr_interface.c @@ -131,7 +131,7 @@ static int pdr_register_listener(struct pdr_handle *pdr, return ret; req.enable = enable; - strcpy(req.service_path, pds->service_path); + strscpy(req.service_path, pds->service_path, sizeof(req.service_path)); ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, &txn, SERVREG_REGISTER_LISTENER_REQ, @@ -257,7 +257,7 @@ static int pdr_send_indack_msg(struct pdr_handle *pdr, struct pdr_service *pds, return ret; req.transaction_id = tid; - strcpy(req.service_path, pds->service_path); + strscpy(req.service_path, pds->service_path, sizeof(req.service_path)); ret = qmi_send_request(&pdr->notifier_hdl, &pds->addr, &txn, SERVREG_SET_ACK_REQ, @@ -406,7 +406,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds) return -ENOMEM; /* Prepare req message */ - strcpy(req.service_name, pds->service_name); + strscpy(req.service_name, pds->service_name, sizeof(req.service_name)); req.domain_offset_valid = true; req.domain_offset = 0; @@ -531,8 +531,8 @@ struct pdr_service *pdr_add_lookup(struct pdr_handle *pdr, return ERR_PTR(-ENOMEM); pds->service = SERVREG_NOTIFIER_SERVICE; - strcpy(pds->service_name, service_name); - strcpy(pds->service_path, service_path); + strscpy(pds->service_name, service_name, sizeof(pds->service_name)); + strscpy(pds->service_path, service_path, sizeof(pds->service_path)); pds->need_locator_lookup = true; mutex_lock(&pdr->list_lock); @@ -587,7 +587,8 @@ int pdr_restart_pd(struct pdr_handle *pdr, struct pdr_service *pds) break; /* Prepare req message */ - strcpy(req.service_path, pds->service_path); + strscpy(req.service_path, pds->service_path, + sizeof(req.service_path)); addr = pds->addr; break; } diff --git a/drivers/soc/renesas/r8a779a0-sysc.c b/drivers/soc/renesas/r8a779a0-sysc.c index d464ffa1be33..7410b9fa9846 100644 --- a/drivers/soc/renesas/r8a779a0-sysc.c +++ b/drivers/soc/renesas/r8a779a0-sysc.c @@ -404,19 +404,21 @@ static int __init r8a779a0_sysc_pd_init(void) for (i = 0; i < info->num_areas; i++) { const struct r8a779a0_sysc_area *area = &info->areas[i]; struct r8a779a0_sysc_pd *pd; + size_t n; if (!area->name) { /* Skip NULLified area */ continue; } - pd = kzalloc(sizeof(*pd) + strlen(area->name) + 1, GFP_KERNEL); + n = strlen(area->name) + 1; + pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL); if (!pd) { error = -ENOMEM; goto out_put; } - strcpy(pd->name, area->name); + memcpy(pd->name, area->name, n); pd->genpd.name = pd->name; pd->pdr = area->pdr; pd->flags = area->flags; diff --git a/drivers/soc/renesas/rcar-sysc.c b/drivers/soc/renesas/rcar-sysc.c index 53387a72ca00..b0a80de34c98 100644 --- a/drivers/soc/renesas/rcar-sysc.c +++ b/drivers/soc/renesas/rcar-sysc.c @@ -396,19 +396,21 @@ static int __init rcar_sysc_pd_init(void) for (i = 0; i < info->num_areas; i++) { const struct rcar_sysc_area *area = &info->areas[i]; struct rcar_sysc_pd *pd; + size_t n; if (!area->name) { /* Skip NULLified area */ continue; } - pd = kzalloc(sizeof(*pd) + strlen(area->name) + 1, GFP_KERNEL); + n = strlen(area->name) + 1; + pd = kzalloc(sizeof(*pd) + n, GFP_KERNEL); if (!pd) { error = -ENOMEM; goto out_put; } - strcpy(pd->name, area->name); + memcpy(pd->name, area->name, n); pd->genpd.name = pd->name; pd->ch.chan_offs = area->chan_offs; pd->ch.chan_bit = area->chan_bit; diff --git a/drivers/soc/ti/knav_dma.c b/drivers/soc/ti/knav_dma.c index 591d14ebcb11..5f9816d317a5 100644 --- a/drivers/soc/ti/knav_dma.c +++ b/drivers/soc/ti/knav_dma.c @@ -691,7 +691,7 @@ static int dma_init(struct device_node *cloud, struct device_node *dma_node) dma->max_rx_flow = max_rx_flow; dma->max_tx_chan = min(max_tx_chan, max_tx_sched); atomic_set(&dma->ref_count, 0); - strcpy(dma->name, node->name); + strscpy(dma->name, node->name, sizeof(dma->name)); spin_lock_init(&dma->lock); for (i = 0; i < dma->max_tx_chan; i++) {