Message ID | 20230403103855.3601901-1-void0red@hust.edu.cn |
---|---|
State | New |
Headers | show |
Series | drivers: thermal: mediatek: fix of_iomap leak in mtk_thermal_probe | expand |
On 03/04/2023 12:38, Kang Chen wrote: > Smatch reports: > 1. mtk_thermal_probe() warn: 'apmixed_base' from of_iomap() not released. > 2. mtk_thermal_probe() warn: 'auxadc_base' from of_iomap() not released. > > The original code forgets to release iomap resource when handling errors, > fix it through unified error handling code at the end of mtk_thermal_probe. > > Fixes: 89945047b166 ("thermal: mediatek: Add tsensor support for V2 thermal system") > Signed-off-by: Kang Chen <void0red@hust.edu.cn> > --- > I think the this should be released on the success path but I was too > scared of breaking things. Let me know and I will resend if people want > me to do that. > > drivers/thermal/mediatek/auxadc_thermal.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c > index ab730f9552d0..741c7d8151bd 100644 > --- a/drivers/thermal/mediatek/auxadc_thermal.c > +++ b/drivers/thermal/mediatek/auxadc_thermal.c > @@ -1149,13 +1149,15 @@ static int mtk_thermal_probe(struct platform_device *pdev) > > if (auxadc_phys_base == OF_BAD_ADDR) { > dev_err(&pdev->dev, "Can't get auxadc phys address\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto err_iounmap_auxadc; > } Better to use the devm_of_iomap() variant And also take the opportunity to use devm_clk_get_enabled(), remove clk_prepare_enable() and the rollbacking in the err_disable_clk_per*: label sections.
diff --git a/drivers/thermal/mediatek/auxadc_thermal.c b/drivers/thermal/mediatek/auxadc_thermal.c index ab730f9552d0..741c7d8151bd 100644 --- a/drivers/thermal/mediatek/auxadc_thermal.c +++ b/drivers/thermal/mediatek/auxadc_thermal.c @@ -1149,13 +1149,15 @@ static int mtk_thermal_probe(struct platform_device *pdev) if (auxadc_phys_base == OF_BAD_ADDR) { dev_err(&pdev->dev, "Can't get auxadc phys address\n"); - return -EINVAL; + ret = -EINVAL; + goto err_iounmap_auxadc; } apmixedsys = of_parse_phandle(np, "mediatek,apmixedsys", 0); if (!apmixedsys) { dev_err(&pdev->dev, "missing apmixedsys node\n"); - return -ENODEV; + ret = -ENODEV; + goto err_iounmap_auxadc; } apmixed_base = of_iomap(apmixedsys, 0); @@ -1165,17 +1167,18 @@ static int mtk_thermal_probe(struct platform_device *pdev) if (apmixed_phys_base == OF_BAD_ADDR) { dev_err(&pdev->dev, "Can't get auxadc phys address\n"); - return -EINVAL; + ret = -EINVAL; + goto err_iounmap_apmixed; } ret = device_reset_optional(&pdev->dev); if (ret) - return ret; + goto err_iounmap_apmixed; ret = clk_prepare_enable(mt->clk_auxadc); if (ret) { dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret); - return ret; + goto err_iounmap_apmixed; } ret = clk_prepare_enable(mt->clk_peri_therm); @@ -1220,7 +1223,10 @@ static int mtk_thermal_probe(struct platform_device *pdev) clk_disable_unprepare(mt->clk_peri_therm); err_disable_clk_auxadc: clk_disable_unprepare(mt->clk_auxadc); - +err_iounmap_apmixed: + iounmap(apmixed_base); +err_iounmap_auxadc: + iounmap(auxadc_base); return ret; }
Smatch reports: 1. mtk_thermal_probe() warn: 'apmixed_base' from of_iomap() not released. 2. mtk_thermal_probe() warn: 'auxadc_base' from of_iomap() not released. The original code forgets to release iomap resource when handling errors, fix it through unified error handling code at the end of mtk_thermal_probe. Fixes: 89945047b166 ("thermal: mediatek: Add tsensor support for V2 thermal system") Signed-off-by: Kang Chen <void0red@hust.edu.cn> --- I think the this should be released on the success path but I was too scared of breaking things. Let me know and I will resend if people want me to do that. drivers/thermal/mediatek/auxadc_thermal.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)