thermal/drivers/rcar: fix error checking in probe()
PATCH v3 1/1 thermal/drivers/rcar: fix error checking in probe()
This code accidentally calls thermal_zone_device_enable() before checking whether thermal_zone_device_register_with_trips() failed. Move the call until later to avoid an error pointer dereference of "priv->zone".
The driver works differently depending on if we are using OF thermal or not. We use thermal_add_hwmon_sysfs() if we are using OF thermal and call thermal_zone_device_enable() if not. We can share same error check for if either of these fail.
Moving the thermal_zone_device_enable() call is a bit cleaner as well. The original code used a three step process to cleanup:
1. Call thermal_zone_device_unregister() to cleanup.
2. Set priv->zone to an error pointer to preserve the error code.
3. Set priv->zone to NULL to avoid a second call to thermal_zone_device_unregister() in the rcar_thermal_remove() function.
Now we can just do a direct goto error_unregister and rcar_thermal_remove() handles the cleanup properly.
---
v2: Use the correct fixes tag and re-write the check in a cleaner way.
v3: Share the same error checking as a further cleanup. The
thermal_add_hwmon_sysfs() and thermal_zone_device_enable() functions really do serve the same purpose even though their names are different.
drivers/thermal/renesas/rcar_thermal.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
drivers/thermal/renesas/rcar_thermal.c +5 -10
@@ -492,12 +492,6 @@ static int rcar_thermal_probe(struct platform_device *pdev)"rcar_thermal" , trips,ARRAY_SIZE (trips), priv, &rcar_thermal_zone_ops,NULL ,0 , idle); - - ret =thermal_zone_device_enable (priv->zone); -if (ret) { -thermal_zone_device_unregister (priv->zone); - priv->zone =ERR_PTR (ret); - } }if (IS_ERR (priv->zone)) {dev_err (dev,"can't register thermal zone\n" );
@@ -506,11 +500,12 @@ static int rcar_thermal_probe(struct platform_device *pdev) goto error_unregister; } -if (chip->use_of_thermal) { +if (chip->use_of_thermal) ret =thermal_add_hwmon_sysfs (priv->zone); -if (ret) - goto error_unregister; - } +else + ret =thermal_zone_device_enable (priv->zone); +if (ret) + goto error_unregister;rcar_thermal_irq_enable (priv);
Signature · 1 line
2.53.0
Hi Dan,
Thanks for your work.
Quoted 17 lines · Dan Carpenter
This code accidentally calls
thermal_zone_device_enable()before checking whetherthermal_zone_device_register_with_trips()failed. Move the call until later to avoid an error pointer dereference of "priv->zone".The driver works differently depending on if we are using OF thermal or not. We use
thermal_add_hwmon_sysfs()if we are using OF thermal and callthermal_zone_device_enable()if not. We can share same error check for if either of these fail.Moving the
thermal_zone_device_enable()call is a bit cleaner as well. The original code used a three step process to cleanup:
1. Callthermal_zone_device_unregister()to cleanup.
2. Setpriv->zoneto an error pointer to preserve the error code.
3. Setpriv->zoneto NULL to avoid a second call tothermal_zone_device_unregister()in thercar_thermal_remove()function.
Quoted 6 lines
Now we can just do a direct goto
error_unregisterandrcar_thermal_remove()handles the cleanup properly.Fixes bbcf90c0646a ("thermal: Explicitly enable non-changing thermal zone devices")Signed-off-by Dan Carpenter <[email protected]>Reviewed-by Geert Uytterhoeven <[email protected]>
Quoted 47 lines
---
v2: Use the correct fixes tag and re-write the check in a cleaner way.
v3: Share the same error checking as a further cleanup. The
thermal_add_hwmon_sysfs()andthermal_zone_device_enable()functions really do serve the same purpose even though their names are different.drivers/thermal/renesas/rcar_thermal.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)drivers/thermal/renesas/rcar_thermal.c +5
-10@@ -492,12 +492,6 @@ static int rcar_thermal_probe(struct platform_device *pdev)"rcar_thermal" , trips,ARRAY_SIZE (trips), priv, &rcar_thermal_zone_ops,NULL ,0 , idle); - - ret =thermal_zone_device_enable (priv->zone); -if (ret) { -thermal_zone_device_unregister (priv->zone); - priv->zone =ERR_PTR (ret); - } }if (IS_ERR (priv->zone)) {dev_err (dev,"can't register thermal zone\n" );@@ -506,11 +500,12 @@ static int rcar_thermal_probe(struct platform_device *pdev) goto error_unregister; } -if (chip->use_of_thermal) { +if (chip->use_of_thermal) ret =thermal_add_hwmon_sysfs (priv->zone); -if (ret) - goto error_unregister; - } +else + ret =thermal_zone_device_enable (priv->zone); +if (ret) + goto error_unregister;rcar_thermal_irq_enable (priv);Signature · 1 line
2.53.0
Signature · 2 lines
Kind Regards, Niklas Söderlund
Daniel Lezcano
AppliedQuoted 17 lines · Dan Carpenter
This code accidentally calls
thermal_zone_device_enable()before checking whetherthermal_zone_device_register_with_trips()failed. Move the call until later to avoid an error pointer dereference of "priv->zone".The driver works differently depending on if we are using OF thermal or not. We use
thermal_add_hwmon_sysfs()if we are using OF thermal and callthermal_zone_device_enable()if not. We can share same error check for if either of these fail.Moving the
thermal_zone_device_enable()call is a bit cleaner as well. The original code used a three step process to cleanup:
1. Callthermal_zone_device_unregister()to cleanup.
2. Setpriv->zoneto an error pointer to preserve the error code.
3. Setpriv->zoneto NULL to avoid a second call tothermal_zone_device_unregister()in thercar_thermal_remove()function.
Quoted 7 lines
Now we can just do a direct goto
error_unregisterandrcar_thermal_remove()handles the cleanup properly.Fixes bbcf90c0646a ("thermal: Explicitly enable non-changing thermal zone devices")Signed-off-by Dan Carpenter <[email protected]>Reviewed-by Geert Uytterhoeven <[email protected]>---
Applied, thanks