Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mfd: Fix dangling pointers

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.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Wolfram Sang and committed by
Samuel Ortiz
f322d5f0 d84027bc

+10 -2
+1
drivers/mfd/88pm860x-i2c.c
··· 202 202 i2c_unregister_device(chip->companion); 203 203 i2c_set_clientdata(chip->companion, NULL); 204 204 i2c_set_clientdata(chip->client, NULL); 205 + i2c_set_clientdata(client, NULL); 205 206 kfree(chip); 206 207 return 0; 207 208 }
+2
drivers/mfd/ab3100-core.c
··· 920 920 i2c_unregister_device(ab3100->testreg_client); 921 921 exit_no_testreg_client: 922 922 exit_no_detect: 923 + i2c_set_clientdata(client, NULL); 923 924 kfree(ab3100); 924 925 return err; 925 926 } ··· 942 941 * their notifiers so deactivate IRQ 943 942 */ 944 943 free_irq(client->irq, ab3100); 944 + i2c_set_clientdata(client, NULL); 945 945 kfree(ab3100); 946 946 return 0; 947 947 }
+1
drivers/mfd/da903x.c
··· 544 544 struct da903x_chip *chip = i2c_get_clientdata(client); 545 545 546 546 da903x_remove_subdevs(chip); 547 + i2c_set_clientdata(client, NULL); 547 548 kfree(chip); 548 549 return 0; 549 550 }
+2 -1
drivers/mfd/menelaus.c
··· 1228 1228 free_irq(client->irq, menelaus); 1229 1229 flush_scheduled_work(); 1230 1230 fail1: 1231 + i2c_set_clientdata(client, NULL); 1231 1232 kfree(menelaus); 1232 1233 return err; 1233 1234 } ··· 1238 1237 struct menelaus_chip *menelaus = i2c_get_clientdata(client); 1239 1238 1240 1239 free_irq(client->irq, menelaus); 1241 - kfree(menelaus); 1242 1240 i2c_set_clientdata(client, NULL); 1241 + kfree(menelaus); 1243 1242 the_menelaus = NULL; 1244 1243 return 0; 1245 1244 }
+1
drivers/mfd/pcf50633-core.c
··· 679 679 for (i = 0; i < PCF50633_NUM_REGULATORS; i++) 680 680 platform_device_unregister(pcf->regulator_pdev[i]); 681 681 682 + i2c_set_clientdata(client, NULL); 682 683 kfree(pcf); 683 684 684 685 return 0;
+1 -1
drivers/mfd/tps65010.c
··· 530 530 cancel_delayed_work(&tps->work); 531 531 flush_scheduled_work(); 532 532 debugfs_remove(tps->file); 533 - kfree(tps); 534 533 i2c_set_clientdata(client, NULL); 534 + kfree(tps); 535 535 the_tps = NULL; 536 536 return 0; 537 537 }
+2
drivers/mfd/wm8350-i2c.c
··· 82 82 return ret; 83 83 84 84 err: 85 + i2c_set_clientdata(i2c, NULL); 85 86 kfree(wm8350); 86 87 return ret; 87 88 } ··· 92 91 struct wm8350 *wm8350 = i2c_get_clientdata(i2c); 93 92 94 93 wm8350_device_exit(wm8350); 94 + i2c_set_clientdata(i2c, NULL); 95 95 kfree(wm8350); 96 96 97 97 return 0;