* [RFT RESEND 2/4] power_supply: ipaq_micro_battery: Fix leaking workqueue
2015-02-20 13:32 [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Krzysztof Kozlowski
@ 2015-02-20 13:32 ` Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 3/4] power_supply: ipaq_micro_battery: Check return values in probe Krzysztof Kozlowski
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Krzysztof Kozlowski @ 2015-02-20 13:32 UTC (permalink / raw)
To: Sebastian Reichel, Dmitry Eremin-Solenikov, David Woodhouse,
Milo Kim, linux-pm, linux-kernel
Cc: Dmitry Artamonow, Marek Belisko, Krzysztof Kozlowski, stable
Driver allocates singlethread workqueue in probe but it is not destroyed
during removal.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Fixes: 00a588f9d27f ("power: add driver for battery reading on iPaq h3xxx")
Cc: <stable@vger.kernel.org>
---
drivers/power/ipaq_micro_battery.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/power/ipaq_micro_battery.c b/drivers/power/ipaq_micro_battery.c
index 9d694605cdb7..698cf1636bb8 100644
--- a/drivers/power/ipaq_micro_battery.c
+++ b/drivers/power/ipaq_micro_battery.c
@@ -251,6 +251,7 @@ static int micro_batt_remove(struct platform_device *pdev)
power_supply_unregister(µ_ac_power);
power_supply_unregister(µ_batt_power);
cancel_delayed_work_sync(&mb->update);
+ destroy_workqueue(mb->wq);
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [RFT RESEND 3/4] power_supply: ipaq_micro_battery: Check return values in probe
2015-02-20 13:32 [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 2/4] power_supply: ipaq_micro_battery: Fix leaking workqueue Krzysztof Kozlowski
@ 2015-02-20 13:32 ` Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 4/4] power_supply: lp8788-charger: Fix leaked power supply on probe fail Krzysztof Kozlowski
2015-02-25 21:22 ` [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Sebastian Reichel
3 siblings, 0 replies; 5+ messages in thread
From: Krzysztof Kozlowski @ 2015-02-20 13:32 UTC (permalink / raw)
To: Sebastian Reichel, Dmitry Eremin-Solenikov, David Woodhouse,
Milo Kim, linux-pm, linux-kernel
Cc: Dmitry Artamonow, Marek Belisko, Krzysztof Kozlowski, stable
The return values of create_singlethread_workqueue() and
power_supply_register() calls were not checked and even on error probe()
function returned 0.
1. If allocation of workqueue failed (returning NULL) then further
accesses could lead to NULL pointer dereference. The
queue_delayed_work() expects workqueue to be non-NULL.
2. If registration of power supply failed then during unbind the driver
tried to unregister power supply which was not actually registered.
This could lead to memory corruption because
power_supply_unregister() unconditionally cleans up given power
supply.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Fixes: 00a588f9d27f ("power: add driver for battery reading on iPaq h3xxx")
Cc: <stable@vger.kernel.org>
---
drivers/power/ipaq_micro_battery.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/power/ipaq_micro_battery.c b/drivers/power/ipaq_micro_battery.c
index 698cf1636bb8..96b15e003f3f 100644
--- a/drivers/power/ipaq_micro_battery.c
+++ b/drivers/power/ipaq_micro_battery.c
@@ -226,6 +226,7 @@ static struct power_supply micro_ac_power = {
static int micro_batt_probe(struct platform_device *pdev)
{
struct micro_battery *mb;
+ int ret;
mb = devm_kzalloc(&pdev->dev, sizeof(*mb), GFP_KERNEL);
if (!mb)
@@ -233,14 +234,30 @@ static int micro_batt_probe(struct platform_device *pdev)
mb->micro = dev_get_drvdata(pdev->dev.parent);
mb->wq = create_singlethread_workqueue("ipaq-battery-wq");
+ if (!mb->wq)
+ return -ENOMEM;
+
INIT_DELAYED_WORK(&mb->update, micro_battery_work);
platform_set_drvdata(pdev, mb);
queue_delayed_work(mb->wq, &mb->update, 1);
- power_supply_register(&pdev->dev, µ_batt_power);
- power_supply_register(&pdev->dev, µ_ac_power);
+
+ ret = power_supply_register(&pdev->dev, µ_batt_power);
+ if (ret < 0)
+ goto batt_err;
+
+ ret = power_supply_register(&pdev->dev, µ_ac_power);
+ if (ret < 0)
+ goto ac_err;
dev_info(&pdev->dev, "iPAQ micro battery driver\n");
return 0;
+
+ac_err:
+ power_supply_unregister(µ_ac_power);
+batt_err:
+ cancel_delayed_work_sync(&mb->update);
+ destroy_workqueue(mb->wq);
+ return ret;
}
static int micro_batt_remove(struct platform_device *pdev)
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* [RFT RESEND 4/4] power_supply: lp8788-charger: Fix leaked power supply on probe fail
2015-02-20 13:32 [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 2/4] power_supply: ipaq_micro_battery: Fix leaking workqueue Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 3/4] power_supply: ipaq_micro_battery: Check return values in probe Krzysztof Kozlowski
@ 2015-02-20 13:32 ` Krzysztof Kozlowski
2015-02-25 21:22 ` [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Sebastian Reichel
3 siblings, 0 replies; 5+ messages in thread
From: Krzysztof Kozlowski @ 2015-02-20 13:32 UTC (permalink / raw)
To: Sebastian Reichel, Dmitry Eremin-Solenikov, David Woodhouse,
Milo Kim, linux-pm, linux-kernel
Cc: Dmitry Artamonow, Marek Belisko, Krzysztof Kozlowski, stable
Driver forgot to unregister charger power supply if registering of
battery supply failed in probe(). In such case the memory associated
with power supply leaked.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Fixes: 98a276649358 ("power_supply: Add new lp8788 charger driver")
Cc: <stable@vger.kernel.org>
---
drivers/power/lp8788-charger.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/power/lp8788-charger.c b/drivers/power/lp8788-charger.c
index 21fc233c7d61..176dab2e4c16 100644
--- a/drivers/power/lp8788-charger.c
+++ b/drivers/power/lp8788-charger.c
@@ -417,8 +417,10 @@ static int lp8788_psy_register(struct platform_device *pdev,
pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop);
pchg->battery.get_property = lp8788_battery_get_property;
- if (power_supply_register(&pdev->dev, &pchg->battery))
+ if (power_supply_register(&pdev->dev, &pchg->battery)) {
+ power_supply_unregister(&pchg->charger);
return -EPERM;
+ }
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register
2015-02-20 13:32 [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register Krzysztof Kozlowski
` (2 preceding siblings ...)
2015-02-20 13:32 ` [RFT RESEND 4/4] power_supply: lp8788-charger: Fix leaked power supply on probe fail Krzysztof Kozlowski
@ 2015-02-25 21:22 ` Sebastian Reichel
3 siblings, 0 replies; 5+ messages in thread
From: Sebastian Reichel @ 2015-02-25 21:22 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Dmitry Eremin-Solenikov, David Woodhouse, Milo Kim, linux-pm,
linux-kernel, Dmitry Artamonow, Marek Belisko, stable
[-- Attachment #1: Type: text/plain, Size: 687 bytes --]
Hi Krzysztof,
On Fri, Feb 20, 2015 at 02:32:22PM +0100, Krzysztof Kozlowski wrote:
> The return value of power_supply_register() call was not checked and
> even on error probe() function returned 0. If registering failed then
> during unbind the driver tried to unregister power supply which was not
> actually registered.
>
> This could lead to memory corruption because power_supply_unregister()
> unconditionally cleans up given power supply.
>
> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
> Fixes: da0a00ebc239 ("power: Add twl4030_madc battery driver.")
> Cc: <stable@vger.kernel.org>
Thanks, added patches 1-4 to fixes branch.
-- Sebastian
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread