Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp404473pxu; Tue, 1 Dec 2020 14:24:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJwBJ8rnRxXtTyreJsL4Tc3yDnAJ17zGDe3fEfSXm61WpONUiJYxUWO5oDL7TMkAzruuSFd6 X-Received: by 2002:a50:955b:: with SMTP id v27mr5238531eda.324.1606861496095; Tue, 01 Dec 2020 14:24:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606861496; cv=none; d=google.com; s=arc-20160816; b=MR3P+UmHeQqfvvRuefwcytLrcmnFhurxGGaT+Qc2TBdmLxzWPPF8vnJCZCYZjUOrpJ 1sRpukM6PlqSz7rDTLQfmxRdMuxjObRPJXu97FF8R6xGYtSYOGc7VA0Y3CPCA9l21EFf vlxFuz6Q0IzfNDIV84DDFdYIzvWjhIUsGVu8cXD60uoJHMOob8ZPJhOgrW8D7ooe7XpU qNQFpBuPW3m/9c+1jp2vxldGpL9HLlKk9v9gmicnC79fsrcNEwplLwTckLPpXv9x6CWb cT6CME9DL2Le0XqIKmM0VKeKaMzRf9AToKKcRmbSbxpIr2Sk1ItBePCoOfx3fuXybu1k ls4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=nlqaU7myL/Pgxvta0d3WjqX8Yn0wOnlTFl41ixAJKck=; b=oLjP0dv5+pu3j3yiTNIz8ibJC7JKVJ+z+6lcMyNRdKKA4VS3AjorBKKYTJx/GLvdIH JtogFH4wpV2pbtt03FpnUL8ssyZu3blDMprgZyBU5QinEvnc8N7Yrac8ygNMsuRj6ch9 sq13IWJQPsxeL2+r2oboJbgiGE3APkRcSD1iLHbmAqSGVPRSiZu/HOLsKEcu6Qz2sNHU eYcr6ko26eW9j+VAU89JDO698hXRWSM3ozYTZ1j0zk19751tTfnm/dppWw9sO0r3ku8c nWn0hNiwxO6+SaRTbYKUiomw4pWH2ow15khvPe2yj6KyOlv/wv5oVhbqIul0MktNWFQv fYVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=glWm+JKa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id g16si818011ejf.167.2020.12.01.14.24.33; Tue, 01 Dec 2020 14:24:56 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=glWm+JKa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389420AbgLAJJW (ORCPT + 99 others); Tue, 1 Dec 2020 04:09:22 -0500 Received: from mail.kernel.org ([198.145.29.99]:45340 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729271AbgLAJIH (ORCPT ); Tue, 1 Dec 2020 04:08:07 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 5F4C52222A; Tue, 1 Dec 2020 09:07:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606813646; bh=UYEILy+IuBD8QrpPprBSjeRO6xFLETx0SzOECgxmNLE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=glWm+JKaSFm+5bJH+dAOvg+YIz5QyHcDbGu8qV95oJRvux5OeGPKkW+7HqnQVpegI 2n9Ykw4tcZi1d099CnSWW+6HIaOwnIWUpUbCADe3IwQJPqAe7t6QCkgAkpz4/b+gMY AFwZDIM2JcUEwM4nIBNusA7GAEJVGi2TX385N0ZA= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sascha Hauer , Florian Fainelli , Lukas Wunner , Vladimir Oltean , Mark Brown , Sudip Mukherjee Subject: [PATCH 5.9 004/152] spi: bcm2835: Fix use-after-free on unbind Date: Tue, 1 Dec 2020 09:51:59 +0100 Message-Id: <20201201084712.233061390@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201201084711.707195422@linuxfoundation.org> References: <20201201084711.707195422@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lukas Wunner commit e1483ac030fb4c57734289742f1c1d38dca61e22 upstream bcm2835_spi_remove() accesses the driver's private data after calling spi_unregister_controller() even though that function releases the last reference on the spi_controller and thereby frees the private data. Fix by switching over to the new devm_spi_alloc_master() helper which keeps the private data accessible until the driver has unbound. Fixes: f8043872e796 ("spi: add driver for BCM2835") Reported-by: Sascha Hauer Reported-by: Florian Fainelli Signed-off-by: Lukas Wunner Cc: # v3.10+: 123456789abc: spi: Introduce device-managed SPI controller allocation Cc: # v3.10+ Cc: Vladimir Oltean Tested-by: Florian Fainelli Acked-by: Florian Fainelli Link: https://lore.kernel.org/r/ad66e0a0ad96feb848814842ecf5b6a4539ef35c.1605121038.git.lukas@wunner.de Signed-off-by: Mark Brown Signed-off-by: Sudip Mukherjee Signed-off-by: Greg Kroah-Hartman --- drivers/spi/spi-bcm2835.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -1278,7 +1278,7 @@ static int bcm2835_spi_probe(struct plat struct bcm2835_spi *bs; int err; - ctlr = spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs), + ctlr = devm_spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs), dma_get_cache_alignment())); if (!ctlr) return -ENOMEM; @@ -1299,26 +1299,17 @@ static int bcm2835_spi_probe(struct plat bs->ctlr = ctlr; bs->regs = devm_platform_ioremap_resource(pdev, 0); - if (IS_ERR(bs->regs)) { - err = PTR_ERR(bs->regs); - goto out_controller_put; - } + if (IS_ERR(bs->regs)) + return PTR_ERR(bs->regs); bs->clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(bs->clk)) { - err = PTR_ERR(bs->clk); - if (err == -EPROBE_DEFER) - dev_dbg(&pdev->dev, "could not get clk: %d\n", err); - else - dev_err(&pdev->dev, "could not get clk: %d\n", err); - goto out_controller_put; - } + if (IS_ERR(bs->clk)) + return dev_err_probe(&pdev->dev, PTR_ERR(bs->clk), + "could not get clk\n"); bs->irq = platform_get_irq(pdev, 0); - if (bs->irq <= 0) { - err = bs->irq ? bs->irq : -ENODEV; - goto out_controller_put; - } + if (bs->irq <= 0) + return bs->irq ? bs->irq : -ENODEV; clk_prepare_enable(bs->clk); @@ -1352,8 +1343,6 @@ out_dma_release: bcm2835_dma_release(ctlr, bs); out_clk_disable: clk_disable_unprepare(bs->clk); -out_controller_put: - spi_controller_put(ctlr); return err; }