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)
committerBen Hutchings <ben@decadent.org.uk>
Fri, 20 Feb 2015 00:49:37 +0000 (00:49 +0000)
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>
[bwh: Backported to 3.2:
 - Move call to of_gpiochip_add() into conditional section rather
   than rearranging gotos and labels which are in different places
   here
 - There's no ACPI support]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/gpio/gpiolib.c

index a971e3d..503104a 100644 (file)
@@ -1075,9 +1075,9 @@ int gpiochip_add(struct gpio_chip *chip)
                                ? (1 << FLAG_IS_OUT)
                                : 0;
                }
                                ? (1 << FLAG_IS_OUT)
                                : 0;
                }
-       }
 
 
-       of_gpiochip_add(chip);
+               of_gpiochip_add(chip);
+       }
 
 unlock:
        spin_unlock_irqrestore(&gpio_lock, flags);
 
 unlock:
        spin_unlock_irqrestore(&gpio_lock, flags);
@@ -1086,8 +1086,10 @@ unlock:
                goto fail;
 
        status = gpiochip_export(chip);
                goto fail;
 
        status = gpiochip_export(chip);
-       if (status)
+       if (status) {
+               of_gpiochip_remove(chip);
                goto fail;
                goto fail;
+       }
 
        return 0;
 fail:
 
        return 0;
 fail: