Message ID | 8d35529d-8ba9-4bdd-a3a3-00d67ab6f2d5@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v3] i2c: i801: Avoid potential double call to gpiod_remove_lookup_table | expand |
On Mon, Mar 4, 2024 at 9:31 PM Heiner Kallweit <hkallweit1@gmail.com> wrote: > If registering the platform device fails, the lookup table is > removed in the error path. On module removal we would try to > remove the lookup table again. Fix this by setting priv->lookup > only if registering the platform device was successful. > In addition free the memory allocated for the lookup table in > the error path. > > Fixes: d308dfbf62ef ("i2c: mux/i801: Switch to use descriptor passing") > Cc: stable@vger.kernel.org > Reviewed-by: Andi Shyti <andi.shyti@kernel.org> > Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> > --- > v2: > - cc stable > - free memory allocated for the lookup table > v3: > - cc'ed Linus My bug I guess, mea culpa. Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij
Hi Linus, > > If registering the platform device fails, the lookup table is > > removed in the error path. On module removal we would try to > > remove the lookup table again. Fix this by setting priv->lookup > > only if registering the platform device was successful. > > In addition free the memory allocated for the lookup table in > > the error path. > > > > Fixes: d308dfbf62ef ("i2c: mux/i801: Switch to use descriptor passing") > > Cc: stable@vger.kernel.org > > Reviewed-by: Andi Shyti <andi.shyti@kernel.org> > > Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> > > --- > > v2: > > - cc stable > > - free memory allocated for the lookup table > > v3: > > - cc'ed Linus > > My bug I guess, mea culpa. > Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Thanks for your review! I have pushed this patch only in my testing branch so that i can still add your r-b. Andi
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 291c609d1..9c624f31c 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c @@ -1428,7 +1428,6 @@ static void i801_add_mux(struct i801_priv *priv) lookup->table[i] = GPIO_LOOKUP(mux_config->gpio_chip, mux_config->gpios[i], "mux", 0); gpiod_add_lookup_table(lookup); - priv->lookup = lookup; /* * Register the mux device, we use PLATFORM_DEVID_NONE here @@ -1442,7 +1441,10 @@ static void i801_add_mux(struct i801_priv *priv) sizeof(struct i2c_mux_gpio_platform_data)); if (IS_ERR(priv->mux_pdev)) { gpiod_remove_lookup_table(lookup); + devm_kfree(dev, lookup); dev_err(dev, "Failed to register i2c-mux-gpio device\n"); + } else { + priv->lookup = lookup; } }