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>
This commit is contained in:
		
							parent
							
								
									d84027bc4d
								
							
						
					
					
						commit
						f322d5f009
					
				| @ -202,6 +202,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; | ||||
| } | ||||
|  | ||||
| @ -920,6 +920,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; | ||||
| } | ||||
| @ -941,6 +942,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; | ||||
| } | ||||
|  | ||||
| @ -544,6 +544,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; | ||||
| } | ||||
|  | ||||
| @ -1228,6 +1228,7 @@ fail2: | ||||
| 	free_irq(client->irq, menelaus); | ||||
| 	flush_scheduled_work(); | ||||
| fail1: | ||||
| 	i2c_set_clientdata(client, NULL); | ||||
| 	kfree(menelaus); | ||||
| 	return err; | ||||
| } | ||||
| @ -1237,8 +1238,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; | ||||
| } | ||||
|  | ||||
| @ -679,6 +679,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; | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
| @ -82,6 +82,7 @@ static int wm8350_i2c_probe(struct i2c_client *i2c, | ||||
| 	return ret; | ||||
| 
 | ||||
| err: | ||||
| 	i2c_set_clientdata(i2c, NULL); | ||||
| 	kfree(wm8350); | ||||
| 	return ret; | ||||
| } | ||||
| @ -91,6 +92,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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user