Re: [PATCH 13/24] mfd: fix dangling pointers

From: Samuel Ortiz
Date: Thu Mar 25 2010 - 06:40:58 EST


Hi Wolfram,

On Sat, Mar 20, 2010 at 03:12:54PM +0100, Wolfram Sang wrote:
> Fix I2C-drivers which missed setting clientdata to NULL before freeing the
> structure it points to. Also fix drivers which do this _after_ the structure
> was freed already.
Patch applied, many thanks.

Cheers,
Samuel.


> Signed-off-by: Wolfram Sang <w.sang@xxxxxxxxxxxxxx>
> Cc: Samuel Ortiz <sameo@xxxxxxxxxxxxxxx>
> Cc: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx>
> ---
>
> Found using coccinelle, then reviewed. Full patchset is available via
> kernel-janitors, linux-i2c, and LKML.
> ---
> drivers/mfd/88pm860x-i2c.c | 1 +
> drivers/mfd/ab3100-core.c | 2 ++
> drivers/mfd/da903x.c | 1 +
> drivers/mfd/menelaus.c | 3 ++-
> drivers/mfd/pcf50633-core.c | 1 +
> drivers/mfd/tps65010.c | 2 +-
> drivers/mfd/wm8350-i2c.c | 2 ++
> 7 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/mfd/88pm860x-i2c.c b/drivers/mfd/88pm860x-i2c.c
> index c37e12b..aa81448 100644
> --- a/drivers/mfd/88pm860x-i2c.c
> +++ b/drivers/mfd/88pm860x-i2c.c
> @@ -201,6 +201,7 @@ static int __devexit pm860x_remove(struct i2c_client *client)
> i2c_unregister_device(chip->companion);
> i2c_set_clientdata(chip->companion, NULL);
> i2c_set_clientdata(chip->client, NULL);
> + i2c_set_clientdata(client, NULL);
> kfree(chip);
> return 0;
> }
> diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c
> index a2ce3b6..e6fc43f 100644
> --- a/drivers/mfd/ab3100-core.c
> +++ b/drivers/mfd/ab3100-core.c
> @@ -919,6 +919,7 @@ static int __init ab3100_probe(struct i2c_client *client,
> i2c_unregister_device(ab3100->testreg_client);
> exit_no_testreg_client:
> exit_no_detect:
> + i2c_set_clientdata(client, NULL);
> kfree(ab3100);
> return err;
> }
> @@ -940,6 +941,7 @@ static int __exit ab3100_remove(struct i2c_client *client)
> * their notifiers so deactivate IRQ
> */
> free_irq(client->irq, ab3100);
> + i2c_set_clientdata(client, NULL);
> kfree(ab3100);
> return 0;
> }
> diff --git a/drivers/mfd/da903x.c b/drivers/mfd/da903x.c
> index e5ffe56..ec8178c 100644
> --- a/drivers/mfd/da903x.c
> +++ b/drivers/mfd/da903x.c
> @@ -543,6 +543,7 @@ static int __devexit da903x_remove(struct i2c_client *client)
> struct da903x_chip *chip = i2c_get_clientdata(client);
>
> da903x_remove_subdevs(chip);
> + i2c_set_clientdata(client, NULL);
> kfree(chip);
> return 0;
> }
> diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c
> index 970afa1..d9e60ba 100644
> --- a/drivers/mfd/menelaus.c
> +++ b/drivers/mfd/menelaus.c
> @@ -1227,6 +1227,7 @@ fail2:
> free_irq(client->irq, menelaus);
> flush_scheduled_work();
> fail1:
> + i2c_set_clientdata(client, NULL);
> kfree(menelaus);
> return err;
> }
> @@ -1236,8 +1237,8 @@ static int __exit menelaus_remove(struct i2c_client *client)
> struct menelaus_chip *menelaus = i2c_get_clientdata(client);
>
> free_irq(client->irq, menelaus);
> - kfree(menelaus);
> i2c_set_clientdata(client, NULL);
> + kfree(menelaus);
> the_menelaus = NULL;
> return 0;
> }
> diff --git a/drivers/mfd/pcf50633-core.c b/drivers/mfd/pcf50633-core.c
> index 03dcc92..ab7b4dd 100644
> --- a/drivers/mfd/pcf50633-core.c
> +++ b/drivers/mfd/pcf50633-core.c
> @@ -675,6 +675,7 @@ static int __devexit pcf50633_remove(struct i2c_client *client)
> for (i = 0; i < PCF50633_NUM_REGULATORS; i++)
> platform_device_unregister(pcf->regulator_pdev[i]);
>
> + i2c_set_clientdata(client, NULL);
> kfree(pcf);
>
> return 0;
> diff --git a/drivers/mfd/tps65010.c b/drivers/mfd/tps65010.c
> index e595530..9b22a77 100644
> --- a/drivers/mfd/tps65010.c
> +++ b/drivers/mfd/tps65010.c
> @@ -530,8 +530,8 @@ static int __exit tps65010_remove(struct i2c_client *client)
> cancel_delayed_work(&tps->work);
> flush_scheduled_work();
> debugfs_remove(tps->file);
> - kfree(tps);
> i2c_set_clientdata(client, NULL);
> + kfree(tps);
> the_tps = NULL;
> return 0;
> }
> diff --git a/drivers/mfd/wm8350-i2c.c b/drivers/mfd/wm8350-i2c.c
> index 8d8c932..2dd3e8a 100644
> --- a/drivers/mfd/wm8350-i2c.c
> +++ b/drivers/mfd/wm8350-i2c.c
> @@ -81,6 +81,7 @@ static int wm8350_i2c_probe(struct i2c_client *i2c,
> return ret;
>
> err:
> + i2c_set_clientdata(i2c, NULL);
> kfree(wm8350);
> return ret;
> }
> @@ -90,6 +91,7 @@ static int wm8350_i2c_remove(struct i2c_client *i2c)
> struct wm8350 *wm8350 = i2c_get_clientdata(i2c);
>
> wm8350_device_exit(wm8350);
> + i2c_set_clientdata(i2c, NULL);
> kfree(wm8350);
>
> return 0;
> --
> 1.7.0
>

--
Intel Open Source Technology Centre
http://oss.intel.com/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/