lkml.org 
[lkml]   [2023]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v3] gpiolib: fix reference leaks when removing GPIO chips still in use
    On Fri, Aug 11, 2023 at 09:30:34PM +0200, Bartosz Golaszewski wrote:
    > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
    >
    > 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

    ...

    > - if (desc && desc->gdev && gpiod_free_commit(desc)) {

    The commit message doesn't explain disappearing of gdev check.

    > - 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);
    > }

    So, if gdev can be NULL, you will get an Oops with new code.

    To keep a status quo this needs to be rewritten.

    --
    With Best Regards,
    Andy Shevchenko


    \
     
     \ /
      Last update: 2023-08-15 11:51    [W:5.677 / U:0.376 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site