• Rafael J. Wysocki's avatar
    PM: core: Fix handling of devices deleted during system-wide resume · 0552e05f
    Rafael J. Wysocki authored
    If a device is deleted by one of its system-wide resume callbacks
    (for example, because it does not appear to be present or accessible
    any more) along with its children, the resume of the children may
    continue leading to use-after-free errors and other issues
    (potentially).
    
    Namely, if the device's children are resumed asynchronously, their
    resume may have been scheduled already before the device's callback
    runs and so the device may be deleted while dpm_wait_for_superior()
    is being executed for them.  The memory taken up by the parent device
    object may be freed then while dpm_wait() is waiting for the parent's
    resume callback to complete, which leads to a use-after-free.
    Moreover, the resume of the children is really not expected to
    continue after they have been unregistered, so it must be terminated
    right away in that case.
    
    To address this problem, modify dpm_wait_for_superior() to check
    if the target device is still there in the system-wide PM list of
    devices and if so, to increment its parent's reference counter, both
    under dpm_list_mtx which prevents device_del() running for the child
    from dropping the parent's reference counter prematurely.
    
    If the device is not present in the system-wide PM list of devices
    any more, the resume of it cannot continue, so check that again after
    dpm_wait() returns, which means that the parent's callback has been
    completed, and pass the result of that check to the caller of
    dpm_wait_for_superior() to allow it to abort the device's resume
    if it is not there any more.
    
    Link: https://lore.kernel.org/linux-pm/1579568452-27253-1-git-send-email-chanho.min@lge.comReported-by: default avatarChanho Min <chanho.min@lge.com>
    Cc: All applicable <stable@vger.kernel.org>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    0552e05f
main.c 52.8 KB