diff options
author | Vladimir Zapolskiy <vz@mleia.com> | 2018-11-02 15:39:43 +0200 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2018-11-09 11:16:57 +0100 |
commit | a05a14049999598a3bb6fab12db6b768a0215522 (patch) | |
tree | 902dc93aede3e9b35673e404aba3c6bb43916e2a /drivers | |
parent | defeea5ee23d9cdd296801a0a9ea885c037ff9c9 (diff) | |
download | linux-a05a14049999598a3bb6fab12db6b768a0215522.tar.gz linux-a05a14049999598a3bb6fab12db6b768a0215522.tar.bz2 linux-a05a14049999598a3bb6fab12db6b768a0215522.zip |
gpio: don't free unallocated ida on gpiochip_add_data_with_key() error path
The change corrects the error path in gpiochip_add_data_with_key()
by avoiding to call ida_simple_remove(), if ida_simple_get() returns
an error.
Note that ida_simple_remove()/ida_free() throws a BUG(), if id argument
is negative, it allows to easily check the correctness of the fix by
fuzzing the return value from ida_simple_get().
Fixes: ff2b13592299 ("gpio: make the gpiochip a real device")
Cc: stable@vger.kernel.org # v4.6+
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpio/gpiolib.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 230e41562462..a2cbb474901c 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1295,7 +1295,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, gdev->descs = kcalloc(chip->ngpio, sizeof(gdev->descs[0]), GFP_KERNEL); if (!gdev->descs) { status = -ENOMEM; - goto err_free_gdev; + goto err_free_ida; } if (chip->ngpio == 0) { @@ -1427,8 +1427,9 @@ err_free_label: kfree_const(gdev->label); err_free_descs: kfree(gdev->descs); -err_free_gdev: +err_free_ida: ida_simple_remove(&gpio_ida, gdev->id); +err_free_gdev: /* failures here can mean systems won't boot... */ pr_err("%s: GPIOs %d..%d (%s) failed to register, %d\n", __func__, gdev->base, gdev->base + gdev->ngpio - 1, |