summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2015-01-12 17:12:24 +0100
committerJiri Slaby <jslaby@suse.cz>2015-01-29 15:44:34 +0100
commit972bdcaff2111ac9e698f29efc8b4ed2bd102474 (patch)
tree3369dcd6522a7decf27f170931912a21d9afad01
parent72464765733575dc89c509f16caabc2af47fda79 (diff)
downloadlwn-972bdcaff2111ac9e698f29efc8b4ed2bd102474.tar.gz
lwn-972bdcaff2111ac9e698f29efc8b4ed2bd102474.zip
gpio: fix memory and reference leaks in gpiochip_add error path
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> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
-rw-r--r--drivers/gpio/gpiolib.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 0dee0e0c247a..aed1a6216b6b 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -1216,18 +1216,20 @@ int gpiochip_add(struct gpio_chip *chip)
spin_unlock_irqrestore(&gpio_lock, flags);
+ if (status)
+ goto fail;
+
#ifdef CONFIG_PINCTRL
INIT_LIST_HEAD(&chip->pin_ranges);
#endif
of_gpiochip_add(chip);
- if (status)
- goto fail;
-
status = gpiochip_export(chip);
- if (status)
+ if (status) {
+ of_gpiochip_remove(chip);
goto fail;
+ }
pr_debug("gpiochip_add: registered GPIOs %d to %d on device: %s\n",
chip->base, chip->base + chip->ngpio - 1,