lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 647/772] ACPI: property: Release subnode properties with data nodes
    Date
    From: Sakari Ailus <sakari.ailus@linux.intel.com>

    commit 3bd561e1572ee02a50cd1a5be339abf1a5b78d56 upstream.

    struct acpi_device_properties describes one source of properties present
    on either struct acpi_device or struct acpi_data_node. When properties are
    parsed, both are populated but when released, only those properties that
    are associated with the device node are freed.

    Fix this by also releasing memory of the data node properties.

    Fixes: 5f5e4890d57a ("ACPI / property: Allow multiple property compatible _DSD entries")
    Cc: 4.20+ <stable@vger.kernel.org> # 4.20+
    Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/acpi/property.c | 18 ++++++++++++------
    1 file changed, 12 insertions(+), 6 deletions(-)

    --- a/drivers/acpi/property.c
    +++ b/drivers/acpi/property.c
    @@ -433,6 +433,16 @@ void acpi_init_properties(struct acpi_de
    acpi_extract_apple_properties(adev);
    }

    +static void acpi_free_device_properties(struct list_head *list)
    +{
    + struct acpi_device_properties *props, *tmp;
    +
    + list_for_each_entry_safe(props, tmp, list, list) {
    + list_del(&props->list);
    + kfree(props);
    + }
    +}
    +
    static void acpi_destroy_nondev_subnodes(struct list_head *list)
    {
    struct acpi_data_node *dn, *next;
    @@ -445,22 +455,18 @@ static void acpi_destroy_nondev_subnodes
    wait_for_completion(&dn->kobj_done);
    list_del(&dn->sibling);
    ACPI_FREE((void *)dn->data.pointer);
    + acpi_free_device_properties(&dn->data.properties);
    kfree(dn);
    }
    }

    void acpi_free_properties(struct acpi_device *adev)
    {
    - struct acpi_device_properties *props, *tmp;
    -
    acpi_destroy_nondev_subnodes(&adev->data.subnodes);
    ACPI_FREE((void *)adev->data.pointer);
    adev->data.of_compatible = NULL;
    adev->data.pointer = NULL;
    - list_for_each_entry_safe(props, tmp, &adev->data.properties, list) {
    - list_del(&props->list);
    - kfree(props);
    - }
    + acpi_free_device_properties(&adev->data.properties);
    }

    /**

    \
     
     \ /
      Last update: 2022-06-07 23:51    [W:2.540 / U:0.360 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site