]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pinctrl: single: fix possible memory leak when pinctrl_enable() fails
authorYang Yingliang <yangyingliang@huawei.com>
Thu, 6 Jun 2024 02:37:03 +0000 (10:37 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 17 Jun 2024 08:33:30 +0000 (10:33 +0200)
This driver calls pinctrl_register_and_init() which is not
devm_ managed, it will leads memory leak if pinctrl_enable()
fails. Replace it with devm_pinctrl_register_and_init().
And call pcs_free_resources() if pinctrl_enable() fails.

Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()")
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://lore.kernel.org/r/20240606023704.3931561-3-yangyingliang@huawei.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/pinctrl-single.c

index a798f31d6954240b6aa0a1a6ed00ca9727b96bc8..4c6bfabb6bd7d8d14fcc6732f0c424e0e178d412 100644 (file)
@@ -1329,7 +1329,6 @@ static void pcs_irq_free(struct pcs_device *pcs)
 static void pcs_free_resources(struct pcs_device *pcs)
 {
        pcs_irq_free(pcs);
-       pinctrl_unregister(pcs->pctl);
 
 #if IS_BUILTIN(CONFIG_PINCTRL_SINGLE)
        if (pcs->missing_nr_pinctrl_cells)
@@ -1879,7 +1878,7 @@ static int pcs_probe(struct platform_device *pdev)
        if (ret < 0)
                goto free;
 
-       ret = pinctrl_register_and_init(&pcs->desc, pcs->dev, pcs, &pcs->pctl);
+       ret = devm_pinctrl_register_and_init(pcs->dev, &pcs->desc, pcs, &pcs->pctl);
        if (ret) {
                dev_err(pcs->dev, "could not register single pinctrl driver\n");
                goto free;
@@ -1912,8 +1911,10 @@ static int pcs_probe(struct platform_device *pdev)
 
        dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size);
 
-       return pinctrl_enable(pcs->pctl);
+       if (pinctrl_enable(pcs->pctl))
+               goto free;
 
+       return 0;
 free:
        pcs_free_resources(pcs);