]>
Commit | Line | Data |
---|---|---|
1e617d6d GKH |
1 | From 68c3ed6fa7e0d69529ced772d650ab128916a81d Mon Sep 17 00:00:00 2001 |
2 | From: Krzysztof Kozlowski <k.kozlowski@samsung.com> | |
3 | Date: Fri, 20 Feb 2015 14:32:22 +0100 | |
4 | Subject: power_supply: twl4030_madc: Check return value of power_supply_register | |
5 | ||
6 | From: Krzysztof Kozlowski <k.kozlowski@samsung.com> | |
7 | ||
8 | commit 68c3ed6fa7e0d69529ced772d650ab128916a81d upstream. | |
9 | ||
10 | The return value of power_supply_register() call was not checked and | |
11 | even on error probe() function returned 0. If registering failed then | |
12 | during unbind the driver tried to unregister power supply which was not | |
13 | actually registered. | |
14 | ||
15 | This could lead to memory corruption because power_supply_unregister() | |
16 | unconditionally cleans up given power supply. | |
17 | ||
18 | Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> | |
19 | Fixes: da0a00ebc239 ("power: Add twl4030_madc battery driver.") | |
20 | Signed-off-by: Sebastian Reichel <sre@kernel.org> | |
21 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
22 | ||
23 | --- | |
24 | drivers/power/twl4030_madc_battery.c | 7 +++++-- | |
25 | 1 file changed, 5 insertions(+), 2 deletions(-) | |
26 | ||
27 | --- a/drivers/power/twl4030_madc_battery.c | |
28 | +++ b/drivers/power/twl4030_madc_battery.c | |
29 | @@ -192,6 +192,7 @@ static int twl4030_madc_battery_probe(st | |
30 | { | |
31 | struct twl4030_madc_battery *twl4030_madc_bat; | |
32 | struct twl4030_madc_bat_platform_data *pdata = pdev->dev.platform_data; | |
33 | + int ret = 0; | |
34 | ||
35 | twl4030_madc_bat = kzalloc(sizeof(*twl4030_madc_bat), GFP_KERNEL); | |
36 | if (!twl4030_madc_bat) | |
37 | @@ -216,9 +217,11 @@ static int twl4030_madc_battery_probe(st | |
38 | ||
39 | twl4030_madc_bat->pdata = pdata; | |
40 | platform_set_drvdata(pdev, twl4030_madc_bat); | |
41 | - power_supply_register(&pdev->dev, &twl4030_madc_bat->psy); | |
42 | + ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy); | |
43 | + if (ret < 0) | |
44 | + kfree(twl4030_madc_bat); | |
45 | ||
46 | - return 0; | |
47 | + return ret; | |
48 | } | |
49 | ||
50 | static int twl4030_madc_battery_remove(struct platform_device *pdev) |