]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: fix memory and reference leaks in gpiochip_add error path
authorJohan Hovold <johan@kernel.org>
Mon, 12 Jan 2015 16:12:24 +0000 (17:12 +0100)
committerZefan Li <lizefan@huawei.com>
Tue, 14 Apr 2015 09:33:52 +0000 (17:33 +0800)
commit 5539b3c938d64a60cb1fc442ac3ce9263d52de0c upstream.

Memory allocated and references taken by of_gpiochip_add and
acpi_gpiochip_add were never released on errors in gpiochip_add (e.g.
failure to find free gpio range).

Fixes: 391c970c0dd1 ("of/gpio: add default of_xlate function if device
has a node pointer")
Fixes: 664e3e5ac64c ("gpio / ACPI: register to ACPI events
automatically")

Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
[lizf: Backported to 3.4:
 - move the call to of_gpiochip_add() into the above if condition.
 - remove the call to acpi_gpiochip_remove()]
Signed-off-by: Zefan Li <lizefan@huawei.com>
drivers/gpio/gpiolib.c

index 112c16e08471f166a61b176a03d1038630e3e691..663570ca2419e560ea8746c3f7da2f7efb02d082 100644 (file)
@@ -1081,19 +1081,18 @@ int gpiochip_add(struct gpio_chip *chip)
                                ? (1 << FLAG_IS_OUT)
                                : 0;
                }
-       }
 
-       of_gpiochip_add(chip);
+               of_gpiochip_add(chip);
+       }
 
 unlock:
        spin_unlock_irqrestore(&gpio_lock, flags);
 
-       if (status)
-               goto fail;
-
        status = gpiochip_export(chip);
-       if (status)
+       if (status) {
+               of_gpiochip_remove(chip);
                goto fail;
+       }
 
        pr_info("gpiochip_add: registered GPIOs %d to %d on device: %s\n",
                chip->base, chip->base + chip->ngpio - 1,