aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2017-10-11 17:59:22 -0400
committerMark Brown <broonie@kernel.org>2017-10-12 04:26:23 -0400
commitc0368e4db4a3e8a3dce40f3f621c06e14c560d79 (patch)
tree2670deb7c4dedb121b74a9479761d1a29f16364a
parent2bd6bf03f4c1c59381d62c61d03f6cc3fe71f66e (diff)
spi: bcm-qspi: Fix use after free in bcm_qspi_probe() in error path
There was an inversion in how the error path in bcm_qspi_probe() is done which would make us trip over a KASAN use-after-free report. Turns out that qspi->dev_ids does not get allocated until later in the probe process. Fix this by introducing a new lable: qspi_resource_err which takes care of cleaning up the SPI master instance. Fixes: fa236a7ef240 ("spi: bcm-qspi: Add Broadcom MSPI driver") Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
-rw-r--r--drivers/spi/spi-bcm-qspi.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c
index 6ef6c44f39f5..a172ab299e80 100644
--- a/drivers/spi/spi-bcm-qspi.c
+++ b/drivers/spi/spi-bcm-qspi.c
@@ -1250,7 +1250,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
1250 goto qspi_probe_err; 1250 goto qspi_probe_err;
1251 } 1251 }
1252 } else { 1252 } else {
1253 goto qspi_probe_err; 1253 goto qspi_resource_err;
1254 } 1254 }
1255 1255
1256 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi"); 1256 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
@@ -1272,7 +1272,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
1272 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res); 1272 qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
1273 if (IS_ERR(qspi->base[CHIP_SELECT])) { 1273 if (IS_ERR(qspi->base[CHIP_SELECT])) {
1274 ret = PTR_ERR(qspi->base[CHIP_SELECT]); 1274 ret = PTR_ERR(qspi->base[CHIP_SELECT]);
1275 goto qspi_probe_err; 1275 goto qspi_resource_err;
1276 } 1276 }
1277 } 1277 }
1278 1278
@@ -1280,7 +1280,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
1280 GFP_KERNEL); 1280 GFP_KERNEL);
1281 if (!qspi->dev_ids) { 1281 if (!qspi->dev_ids) {
1282 ret = -ENOMEM; 1282 ret = -ENOMEM;
1283 goto qspi_probe_err; 1283 goto qspi_resource_err;
1284 } 1284 }
1285 1285
1286 for (val = 0; val < num_irqs; val++) { 1286 for (val = 0; val < num_irqs; val++) {
@@ -1369,8 +1369,9 @@ qspi_reg_err:
1369 bcm_qspi_hw_uninit(qspi); 1369 bcm_qspi_hw_uninit(qspi);
1370 clk_disable_unprepare(qspi->clk); 1370 clk_disable_unprepare(qspi->clk);
1371qspi_probe_err: 1371qspi_probe_err:
1372 spi_master_put(master);
1373 kfree(qspi->dev_ids); 1372 kfree(qspi->dev_ids);
1373qspi_resource_err:
1374 spi_master_put(master);
1374 return ret; 1375 return ret;
1375} 1376}
1376/* probe function to be called by SoC specific platform driver probe */ 1377/* probe function to be called by SoC specific platform driver probe */