]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: gpio: fix memory leaks at init and exit
authorJohan Hovold <johan@hovoldconsulting.com>
Fri, 13 Feb 2015 06:58:04 +0000 (14:58 +0800)
committerGreg Kroah-Hartman <greg@kroah.com>
Wed, 18 Feb 2015 00:31:27 +0000 (16:31 -0800)
Fix three related memory leaks in the init an exit callbacks, where the
gpio-lines array was never freed at all and the controller data wasn't
freed in the init error path.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/gpio.c

index a55327c17c7967d4fbf3973863b38b4c44ef1b92..81901bdd9477482c21b0d9e295aa3020d3f3974c 100644 (file)
@@ -734,7 +734,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
 
        ret = gb_gpio_controller_setup(gb_gpio_controller);
        if (ret)
-               goto out_err;
+               goto err_free_controller;
 
        irqc = &gb_gpio_controller->irqc;
        irqc->irq_ack = gb_gpio_ack_irq;
@@ -766,7 +766,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
        ret = gpiochip_add(gpio);
        if (ret) {
                pr_err("Failed to register GPIO\n");
-               goto out_err;
+               goto err_free_lines;
        }
 
        ret = gb_gpio_irqchip_add(gpio, irqc, 0,
@@ -780,7 +780,9 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
 
 irqchip_err:
        gb_gpiochip_remove(gpio);
-out_err:
+err_free_lines:
+       kfree(gb_gpio_controller->lines);
+err_free_controller:
        kfree(gb_gpio_controller);
        return ret;
 }
@@ -795,6 +797,7 @@ static void gb_gpio_connection_exit(struct gb_connection *connection)
        gb_gpio_irqchip_remove(gb_gpio_controller);
        gb_gpiochip_remove(&gb_gpio_controller->chip);
        /* kref_put(gb_gpio_controller->connection) */
+       kfree(gb_gpio_controller->lines);
        kfree(gb_gpio_controller);
 }