]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Nov 2020 18:10:13 +0000 (19:10 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Nov 2020 18:10:13 +0000 (19:10 +0100)
added patches:
spi-bcm2835-fix-use-after-free-on-unbind.patch

queue-5.9/series
queue-5.9/spi-bcm2835-fix-use-after-free-on-unbind.patch [new file with mode: 0644]

index bea91a17c40571b6adafb69cb88a724a4df9d077..8aceea7fb4fcc5e0cd0614a3b803b0bdc023d27b 100644 (file)
@@ -1,3 +1,4 @@
 io_uring-get-an-active-ref_node-from-files_data.patch
 io_uring-order-refnode-recycling.patch
 spi-bcm-qspi-fix-use-after-free-on-unbind.patch
+spi-bcm2835-fix-use-after-free-on-unbind.patch
diff --git a/queue-5.9/spi-bcm2835-fix-use-after-free-on-unbind.patch b/queue-5.9/spi-bcm2835-fix-use-after-free-on-unbind.patch
new file mode 100644 (file)
index 0000000..20a6708
--- /dev/null
@@ -0,0 +1,87 @@
+From foo@baz Tue Nov 24 07:07:16 PM CET 2020
+From: Lukas Wunner <lukas@wunner.de>
+Date: Wed, 11 Nov 2020 20:07:20 +0100
+Subject: spi: bcm2835: Fix use-after-free on unbind
+
+From: Lukas Wunner <lukas@wunner.de>
+
+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 <s.hauer@pengutronix.de>
+Reported-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Cc: <stable@vger.kernel.org> # v3.10+: 123456789abc: spi: Introduce device-managed SPI controller allocation
+Cc: <stable@vger.kernel.org> # v3.10+
+Cc: Vladimir Oltean <olteanv@gmail.com>
+Tested-by: Florian Fainelli <f.fainelli@gmail.com>
+Acked-by: Florian Fainelli <f.fainelli@gmail.com>
+Link: https://lore.kernel.org/r/ad66e0a0ad96feb848814842ecf5b6a4539ef35c.1605121038.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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;
+ }