Linux SPI subsystem development
 help / color / mirror / Atom feed
* [PATCH 1/2] spi: spidev: fix a race between spidev_release and spidev_remove
@ 2020-06-18  3:21 Zhenzhong Duan
  2020-06-18  3:21 ` [PATCH 2/2] spi: spidev: fix a potential use-after-free in spidev_release() Zhenzhong Duan
  2020-06-18 16:48 ` [PATCH 1/2] spi: spidev: fix a race between spidev_release and spidev_remove Mark Brown
  0 siblings, 2 replies; 3+ messages in thread
From: Zhenzhong Duan @ 2020-06-18  3:21 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-spi, broonie, Zhenzhong Duan

Imagine below scene, spidev is referenced after it's freed.

spidev_release()                spidev_remove()
...
                                spin_lock_irq(&spidev->spi_lock);
                                    spidev->spi = NULL;
                                spin_unlock_irq(&spidev->spi_lock);
mutex_lock(&device_list_lock);
dofree = (spidev->spi == NULL);
if (dofree)
    kfree(spidev);
mutex_unlock(&device_list_lock);
                                mutex_lock(&device_list_lock);
                                list_del(&spidev->device_entry);
                                device_destroy(spidev_class, spidev->devt);
                                clear_bit(MINOR(spidev->devt), minors);
                                if (spidev->users == 0)
                                    kfree(spidev);
                                mutex_unlock(&device_list_lock);

Fix it by resetting spidev->spi in device_list_lock's protection.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@gmail.com>
---
 drivers/spi/spidev.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index d753df7..f74ea26 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -787,13 +787,13 @@ static int spidev_remove(struct spi_device *spi)
 {
 	struct spidev_data	*spidev = spi_get_drvdata(spi);
 
+	/* prevent new opens */
+	mutex_lock(&device_list_lock);
 	/* make sure ops on existing fds can abort cleanly */
 	spin_lock_irq(&spidev->spi_lock);
 	spidev->spi = NULL;
 	spin_unlock_irq(&spidev->spi_lock);
 
-	/* prevent new opens */
-	mutex_lock(&device_list_lock);
 	list_del(&spidev->device_entry);
 	device_destroy(spidev_class, spidev->devt);
 	clear_bit(MINOR(spidev->devt), minors);
-- 
1.8.3.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-06-18 16:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-18  3:21 [PATCH 1/2] spi: spidev: fix a race between spidev_release and spidev_remove Zhenzhong Duan
2020-06-18  3:21 ` [PATCH 2/2] spi: spidev: fix a potential use-after-free in spidev_release() Zhenzhong Duan
2020-06-18 16:48 ` [PATCH 1/2] spi: spidev: fix a race between spidev_release and spidev_remove Mark Brown

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox