lkml.org 
[lkml]   [2017]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 005/125] thermal: max77620: fix device-node reference imbalance
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Johan Hovold <johan@kernel.org>

    commit c592fafbdbb6b1279b76a54722d1465ca77e5bde upstream.

    The thermal child device reuses the parent MFD-device device-tree node
    when registering a thermal zone, but did not take a reference to the
    node.

    This leads to a reference imbalance, and potential use-after-free, when
    the node reference is dropped by the platform-bus device destructor
    (once for the child and later again for the parent).

    Fix this by dropping any reference already held to a device-tree node
    and getting a reference to the parent's node which will be balanced on
    reprobe or on platform-device release, whichever comes first.

    Note that simply clearing the of_node pointer on probe errors and on
    driver unbind would not allow the use of device-managed resources as
    specifically thermal_zone_of_sensor_unregister() claims that a valid
    device-tree node pointer is needed during deregistration (even if it
    currently does not seem to use it).

    Fixes: ec4664b3fd6d ("thermal: max77620: Add thermal driver for reporting junction temp")
    Cc: Laxman Dewangan <ldewangan@nvidia.com>
    Signed-off-by: Johan Hovold <johan@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/thermal/max77620_thermal.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    --- a/drivers/thermal/max77620_thermal.c
    +++ b/drivers/thermal/max77620_thermal.c
    @@ -104,8 +104,6 @@ static int max77620_thermal_probe(struct
    return -EINVAL;
    }

    - pdev->dev.of_node = pdev->dev.parent->of_node;
    -
    mtherm->dev = &pdev->dev;
    mtherm->rmap = dev_get_regmap(pdev->dev.parent, NULL);
    if (!mtherm->rmap) {
    @@ -113,6 +111,14 @@ static int max77620_thermal_probe(struct
    return -ENODEV;
    }

    + /*
    + * Drop any current reference to a device-tree node and get a
    + * reference to the parent's node which will be balanced on reprobe or
    + * on platform-device release.
    + */
    + of_node_put(pdev->dev.of_node);
    + pdev->dev.of_node = of_node_get(pdev->dev.parent->of_node);
    +
    mtherm->tz_device = devm_thermal_zone_of_sensor_register(&pdev->dev, 0,
    mtherm, &max77620_thermal_ops);
    if (IS_ERR(mtherm->tz_device)) {

    \
     
     \ /
      Last update: 2017-07-25 22:41    [W:4.044 / U:0.576 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site