]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
pinctrl: nomadik: fix possible object reference leak
authorWangBo <wdjjwb@163.com>
Fri, 15 Feb 2019 08:01:36 +0000 (16:01 +0800)
committerLinus Walleij <linus.walleij@linaro.org>
Wed, 20 Feb 2019 09:52:34 +0000 (10:52 +0100)
The of_find_device_by_node takes a reference to the struct device
when find the match device ,we should release it when fail.

Signed-off-by: WangBo <wang.bo116@zte.com.cn>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/nomadik/pinctrl-nomadik.c

index 4cc2c47f87783f89ac1719d81e47fa1016136f80..ec02739bd21b43a4787542fefcc253816fadb630 100644 (file)
@@ -1056,17 +1056,22 @@ static struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,
        }
        if (of_property_read_u32(np, "gpio-bank", &id)) {
                dev_err(&pdev->dev, "populate: gpio-bank property not found\n");
+               platform_device_put(gpio_pdev);
                return ERR_PTR(-EINVAL);
        }
 
        /* Already populated? */
        nmk_chip = nmk_gpio_chips[id];
-       if (nmk_chip)
+       if (nmk_chip) {
+               platform_device_put(gpio_pdev);
                return nmk_chip;
+       }
 
        nmk_chip = devm_kzalloc(&pdev->dev, sizeof(*nmk_chip), GFP_KERNEL);
-       if (!nmk_chip)
+       if (!nmk_chip) {
+               platform_device_put(gpio_pdev);
                return ERR_PTR(-ENOMEM);
+       }
 
        nmk_chip->bank = id;
        chip = &nmk_chip->chip;
@@ -1077,13 +1082,17 @@ static struct nmk_gpio_chip *nmk_gpio_populate_chip(struct device_node *np,
 
        res = platform_get_resource(gpio_pdev, IORESOURCE_MEM, 0);
        base = devm_ioremap_resource(&pdev->dev, res);
-       if (IS_ERR(base))
+       if (IS_ERR(base)) {
+               platform_device_put(gpio_pdev);
                return ERR_CAST(base);
+       }
        nmk_chip->addr = base;
 
        clk = clk_get(&gpio_pdev->dev, NULL);
-       if (IS_ERR(clk))
+       if (IS_ERR(clk)) {
+               platform_device_put(gpio_pdev);
                return (void *) clk;
+       }
        clk_prepare(clk);
        nmk_chip->clk = clk;