patch "thermal: max77620: fix device-node reference imbalance" added to usb-next
Subsystems (2)
This is a note to let you know that I've just added the patch titled
thermal: max77620: fix device-node reference imbalance
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-next branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will also be merged in the next major kernel release during the merge window.
If you have any questions about this process, please let me know.
Quoted 1 line
From
c592fafbdbb6b1279b76a54722d1465ca77e5bdeMon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Tue, 6 Jun 2017 17:59:03 +0200
Subject: thermal: max77620: fix device-node reference imbalance
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).
--- drivers/thermal/max77620_thermal.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/thermal/max77620_thermal.c +8 -2
@@ -104,8 +104,6 @@ static int max77620_thermal_probe(struct platform_device *pdev)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 platform_device *pdev)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)) {
Signature · 1 line
2.13.1