Message ID | 1615545286-5395-1-git-send-email-alain.volmat@foss.st.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | spi: stm32: drop devres version of spi_register_master | expand |
On Fri, 12 Mar 2021 11:34:46 +0100, Alain Volmat wrote: > A call to spi_unregister_master() triggers calling remove() > for all the spi devices binded to the spi master. > > Some spi device driver requires to "talk" with the spi device > during the remove(), e.g.: > - a LCD panel like drivers/gpu/drm/panel/panel-lg-lg4573.c > will turn off the backlighting sending a command over spi. > This implies that the spi master must be fully functional when > spi_unregister_master() is called, either if it is called > explicitly in the master's remove() code or implicitly by the > devres framework. > > [...] Applied to https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next Thanks! [1/1] spi: stm32: drop devres version of spi_register_master commit: 8d559a64f00b59af9cc02b803ff52f6e6880a651 All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark
Hi Lukas, On Tue, Mar 16, 2021 at 10:17:44PM +0100, Lukas Wunner wrote: > On Fri, Mar 12, 2021 at 11:34:46AM +0100, Alain Volmat wrote: > > --- a/drivers/spi/spi-stm32.c > > +++ b/drivers/spi/spi-stm32.c > > @@ -1960,6 +1960,7 @@ static int stm32_spi_remove(struct platform_device *pdev) > > struct spi_master *master = platform_get_drvdata(pdev); > > struct stm32_spi *spi = spi_master_get_devdata(master); > > > > + spi_unregister_master(master); > > spi->cfg->disable(spi); > > > > if (master->dma_tx) > > This introduces a use-after-free because spi_unregister_master() > drops the last reference on the spi_master allocation (which includes > the struct stm32_spi), causing it to be freed, yet the stm32_spi > struct is accessed afterwards. Indeed. Thanks. I've fixed that and will post it. > You need to convert the driver to devm_spi_alloc_master() to > fix the use-after-free. See commit 6cfd39e212de for an example. > > Thanks, > > Lukas
diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c index 25c076461011..97cf3a2d4180 100644 --- a/drivers/spi/spi-stm32.c +++ b/drivers/spi/spi-stm32.c @@ -1929,7 +1929,7 @@ static int stm32_spi_probe(struct platform_device *pdev) pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); - ret = devm_spi_register_master(&pdev->dev, master); + ret = spi_register_master(master); if (ret) { dev_err(&pdev->dev, "spi master registration failed: %d\n", ret); @@ -1960,6 +1960,7 @@ static int stm32_spi_remove(struct platform_device *pdev) struct spi_master *master = platform_get_drvdata(pdev); struct stm32_spi *spi = spi_master_get_devdata(master); + spi_unregister_master(master); spi->cfg->disable(spi); if (master->dma_tx)