Patch "gpiolib: fix reference leaks when removing GPIO chips still in use" has been added to the 6.4-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    gpiolib: fix reference leaks when removing GPIO chips still in use

to the 6.4-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     gpiolib-fix-reference-leaks-when-removing-gpio-chips.patch
and it can be found in the queue-6.4 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 4ae9024e713c88037467ed62c0d6a08f3612b26f
Author: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx>
Date:   Fri Aug 11 21:30:34 2023 +0200

    gpiolib: fix reference leaks when removing GPIO chips still in use
    
    [ Upstream commit 3386fb86ecdef0d39ee3306aea8ec290e61b934f ]
    
    After we remove a GPIO chip that still has some requested descriptors,
    gpiod_free_commit() will fail and we will never put the references to the
    GPIO device and the owning module in gpiod_free().
    
    Rework this function to:
    - not warn on desc == NULL as this is a use-case on which most free
      functions silently return
    - put the references to desc->gdev and desc->gdev->owner unconditionally
      so that the release callback actually gets called when the remaining
      references are dropped by external GPIO users
    
    Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx>
    Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 5be8ad61523eb..6e7701f80929f 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2175,12 +2175,18 @@ static bool gpiod_free_commit(struct gpio_desc *desc)
 
 void gpiod_free(struct gpio_desc *desc)
 {
-	if (desc && desc->gdev && gpiod_free_commit(desc)) {
-		module_put(desc->gdev->owner);
-		gpio_device_put(desc->gdev);
-	} else {
+	/*
+	 * We must not use VALIDATE_DESC_VOID() as the underlying gdev->chip
+	 * may already be NULL but we still want to put the references.
+	 */
+	if (!desc)
+		return;
+
+	if (!gpiod_free_commit(desc))
 		WARN_ON(extra_checks);
-	}
+
+	module_put(desc->gdev->owner);
+	gpio_device_put(desc->gdev);
 }
 
 /**



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux