Revert "spi: Fix use-after-free with devm_spi_alloc_*"
This reverts commit 28a5529068 which is
commit 794aaf01444d4e765e2b067cba01cc69c1c68ed9 upstream.
It breaks the abi for SPI drivers and shouldn't be a problem for Android
devices.
Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I6bfd496ebbdcc490058e9e6c29ab29b8fee57b3e
This commit is contained in:
@ -2084,7 +2084,6 @@ struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
|
|||||||
|
|
||||||
ctlr = __spi_alloc_controller(dev, size, slave);
|
ctlr = __spi_alloc_controller(dev, size, slave);
|
||||||
if (ctlr) {
|
if (ctlr) {
|
||||||
ctlr->devm_allocated = true;
|
|
||||||
*ptr = ctlr;
|
*ptr = ctlr;
|
||||||
devres_add(dev, ptr);
|
devres_add(dev, ptr);
|
||||||
} else {
|
} else {
|
||||||
@ -2345,6 +2344,11 @@ int devm_spi_register_controller(struct device *dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(devm_spi_register_controller);
|
EXPORT_SYMBOL_GPL(devm_spi_register_controller);
|
||||||
|
|
||||||
|
static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
|
||||||
|
{
|
||||||
|
return *(struct spi_controller **)res == ctlr;
|
||||||
|
}
|
||||||
|
|
||||||
static int __unregister(struct device *dev, void *null)
|
static int __unregister(struct device *dev, void *null)
|
||||||
{
|
{
|
||||||
spi_unregister_device(to_spi_device(dev));
|
spi_unregister_device(to_spi_device(dev));
|
||||||
@ -2391,7 +2395,8 @@ void spi_unregister_controller(struct spi_controller *ctlr)
|
|||||||
/* Release the last reference on the controller if its driver
|
/* Release the last reference on the controller if its driver
|
||||||
* has not yet been converted to devm_spi_alloc_master/slave().
|
* has not yet been converted to devm_spi_alloc_master/slave().
|
||||||
*/
|
*/
|
||||||
if (!ctlr->devm_allocated)
|
if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
|
||||||
|
devm_spi_match_controller, ctlr))
|
||||||
put_device(&ctlr->dev);
|
put_device(&ctlr->dev);
|
||||||
|
|
||||||
/* free bus id */
|
/* free bus id */
|
||||||
|
|||||||
@ -450,9 +450,6 @@ struct spi_controller {
|
|||||||
|
|
||||||
#define SPI_MASTER_GPIO_SS BIT(5) /* GPIO CS must select slave */
|
#define SPI_MASTER_GPIO_SS BIT(5) /* GPIO CS must select slave */
|
||||||
|
|
||||||
/* flag indicating this is a non-devres managed controller */
|
|
||||||
bool devm_allocated;
|
|
||||||
|
|
||||||
/* flag indicating this is an SPI slave controller */
|
/* flag indicating this is an SPI slave controller */
|
||||||
bool slave;
|
bool slave;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user