Skip to content

Commit 383d4f5

Browse files
Felix Gubroonie
authored andcommitted
spi: spi-sprd-adi: Fix double free in probe error path
The driver currently uses spi_alloc_host() to allocate the controller but registers it using devm_spi_register_controller(). If devm_register_restart_handler() fails, the code jumps to the put_ctlr label and calls spi_controller_put(). However, since the controller was registered via a devm function, the device core will automatically call spi_controller_put() again when the probe fails. This results in a double-free of the spi_controller structure. Fix this by switching to devm_spi_alloc_host() and removing the manual spi_controller_put() call. Fixes: ac17750 ("spi: sprd: Add the support of restarting the system") Signed-off-by: Felix Gu <gu_0233@qq.com> Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com> Link: https://patch.msgid.link/tencent_AC7D389CE7E24318445E226F7CDCCC2F0D07@qq.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 9ace475 commit 383d4f5

1 file changed

Lines changed: 10 additions & 23 deletions

File tree

drivers/spi/spi-sprd-adi.c

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -528,18 +528,16 @@ static int sprd_adi_probe(struct platform_device *pdev)
528528
pdev->id = of_alias_get_id(np, "spi");
529529
num_chipselect = of_get_child_count(np);
530530

531-
ctlr = spi_alloc_host(&pdev->dev, sizeof(struct sprd_adi));
531+
ctlr = devm_spi_alloc_host(&pdev->dev, sizeof(struct sprd_adi));
532532
if (!ctlr)
533533
return -ENOMEM;
534534

535535
dev_set_drvdata(&pdev->dev, ctlr);
536536
sadi = spi_controller_get_devdata(ctlr);
537537

538538
sadi->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
539-
if (IS_ERR(sadi->base)) {
540-
ret = PTR_ERR(sadi->base);
541-
goto put_ctlr;
542-
}
539+
if (IS_ERR(sadi->base))
540+
return PTR_ERR(sadi->base);
543541

544542
sadi->slave_vbase = (unsigned long)sadi->base +
545543
data->slave_offset;
@@ -551,18 +549,15 @@ static int sprd_adi_probe(struct platform_device *pdev)
551549
if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
552550
sadi->hwlock =
553551
devm_hwspin_lock_request_specific(&pdev->dev, ret);
554-
if (!sadi->hwlock) {
555-
ret = -ENXIO;
556-
goto put_ctlr;
557-
}
552+
if (!sadi->hwlock)
553+
return -ENXIO;
558554
} else {
559555
switch (ret) {
560556
case -ENOENT:
561557
dev_info(&pdev->dev, "no hardware spinlock supplied\n");
562558
break;
563559
default:
564-
dev_err_probe(&pdev->dev, ret, "failed to find hwlock id\n");
565-
goto put_ctlr;
560+
return dev_err_probe(&pdev->dev, ret, "failed to find hwlock id\n");
566561
}
567562
}
568563

@@ -579,26 +574,18 @@ static int sprd_adi_probe(struct platform_device *pdev)
579574
ctlr->transfer_one = sprd_adi_transfer_one;
580575

581576
ret = devm_spi_register_controller(&pdev->dev, ctlr);
582-
if (ret) {
583-
dev_err(&pdev->dev, "failed to register SPI controller\n");
584-
goto put_ctlr;
585-
}
577+
if (ret)
578+
return dev_err_probe(&pdev->dev, ret, "failed to register SPI controller\n");
586579

587580
if (sadi->data->restart) {
588581
ret = devm_register_restart_handler(&pdev->dev,
589582
sadi->data->restart,
590583
sadi);
591-
if (ret) {
592-
dev_err(&pdev->dev, "can not register restart handler\n");
593-
goto put_ctlr;
594-
}
584+
if (ret)
585+
return dev_err_probe(&pdev->dev, ret, "can not register restart handler\n");
595586
}
596587

597588
return 0;
598-
599-
put_ctlr:
600-
spi_controller_put(ctlr);
601-
return ret;
602589
}
603590

604591
static struct sprd_adi_data sc9860_data = {

0 commit comments

Comments
 (0)