Commit 35a64f2c authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: gpio: fix memory leaks at init and exit

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: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 036aad9d
...@@ -734,7 +734,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection) ...@@ -734,7 +734,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
ret = gb_gpio_controller_setup(gb_gpio_controller); ret = gb_gpio_controller_setup(gb_gpio_controller);
if (ret) if (ret)
goto out_err; goto err_free_controller;
irqc = &gb_gpio_controller->irqc; irqc = &gb_gpio_controller->irqc;
irqc->irq_ack = gb_gpio_ack_irq; irqc->irq_ack = gb_gpio_ack_irq;
...@@ -766,7 +766,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection) ...@@ -766,7 +766,7 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
ret = gpiochip_add(gpio); ret = gpiochip_add(gpio);
if (ret) { if (ret) {
pr_err("Failed to register GPIO\n"); pr_err("Failed to register GPIO\n");
goto out_err; goto err_free_lines;
} }
ret = gb_gpio_irqchip_add(gpio, irqc, 0, ret = gb_gpio_irqchip_add(gpio, irqc, 0,
...@@ -780,7 +780,9 @@ static int gb_gpio_connection_init(struct gb_connection *connection) ...@@ -780,7 +780,9 @@ static int gb_gpio_connection_init(struct gb_connection *connection)
irqchip_err: irqchip_err:
gb_gpiochip_remove(gpio); gb_gpiochip_remove(gpio);
out_err: err_free_lines:
kfree(gb_gpio_controller->lines);
err_free_controller:
kfree(gb_gpio_controller); kfree(gb_gpio_controller);
return ret; return ret;
} }
...@@ -795,6 +797,7 @@ static void gb_gpio_connection_exit(struct gb_connection *connection) ...@@ -795,6 +797,7 @@ static void gb_gpio_connection_exit(struct gb_connection *connection)
gb_gpio_irqchip_remove(gb_gpio_controller); gb_gpio_irqchip_remove(gb_gpio_controller);
gb_gpiochip_remove(&gb_gpio_controller->chip); gb_gpiochip_remove(&gb_gpio_controller->chip);
/* kref_put(gb_gpio_controller->connection) */ /* kref_put(gb_gpio_controller->connection) */
kfree(gb_gpio_controller->lines);
kfree(gb_gpio_controller); kfree(gb_gpio_controller);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment