Skip to content

Commit b341c11

Browse files
marckleinebuddebroonie
authored andcommitted
spi: spi-fsl-lpspi: fix teardown order issue (UAF)
There is a teardown order issue in the driver. The SPI controller is registered using devm_spi_register_controller(), which delays unregistration of the SPI controller until after the fsl_lpspi_remove() function returns. As the fsl_lpspi_remove() function synchronously tears down the DMA channels, a running SPI transfer triggers the following NULL pointer dereference due to use after free: | fsl_lpspi 42550000.spi: I/O Error in DMA RX | Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 [...] | Call trace: | fsl_lpspi_dma_transfer+0x260/0x340 [spi_fsl_lpspi] | fsl_lpspi_transfer_one+0x198/0x448 [spi_fsl_lpspi] | spi_transfer_one_message+0x49c/0x7c8 | __spi_pump_transfer_message+0x120/0x420 | __spi_sync+0x2c4/0x520 | spi_sync+0x34/0x60 | spidev_message+0x20c/0x378 [spidev] | spidev_ioctl+0x398/0x750 [spidev] [...] Switch from devm_spi_register_controller() to spi_register_controller() in fsl_lpspi_probe() and add the corresponding spi_unregister_controller() in fsl_lpspi_remove(). Fixes: 5314987 ("spi: imx: add lpspi bus driver") Signed-off-by: Marc Kleine-Budde <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 8d2e0cb commit b341c11

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

drivers/spi/spi-fsl-lpspi.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1009,7 +1009,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
10091009
enable_irq(irq);
10101010
}
10111011

1012-
ret = devm_spi_register_controller(&pdev->dev, controller);
1012+
ret = spi_register_controller(controller);
10131013
if (ret < 0) {
10141014
dev_err_probe(&pdev->dev, ret, "spi_register_controller error\n");
10151015
goto free_dma;
@@ -1035,6 +1035,7 @@ static void fsl_lpspi_remove(struct platform_device *pdev)
10351035
struct fsl_lpspi_data *fsl_lpspi =
10361036
spi_controller_get_devdata(controller);
10371037

1038+
spi_unregister_controller(controller);
10381039
fsl_lpspi_dma_exit(controller);
10391040

10401041
pm_runtime_dont_use_autosuspend(fsl_lpspi->dev);

0 commit comments

Comments
 (0)