* [RFT RESEND 1/4] power_supply: twl4030_madc: Check return value of power_supply_register
@ 2015-02-20 13:32 Krzysztof Kozlowski
2015-02-20 13:32 ` [RFT RESEND 2/4] power_supply: ipaq_micro_battery: Fix leaking workqueue Krzysztof Kozlowski
` (3 more replies)
0 siblings, 4 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 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>
---
drivers/power/twl4030_madc_battery.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/power/twl4030_madc_battery.c b/drivers/power/twl4030_madc_battery.c
index 7ef445a6cfa6..cf907609ec49 100644
--- a/drivers/power/twl4030_madc_battery.c
+++ b/drivers/power/twl4030_madc_battery.c
@@ -192,6 +192,7 @@ static int twl4030_madc_battery_probe(struct platform_device *pdev)
{
struct twl4030_madc_battery *twl4030_madc_bat;
struct twl4030_madc_bat_platform_data *pdata = pdev->dev.platform_data;
+ int ret = 0;
twl4030_madc_bat = kzalloc(sizeof(*twl4030_madc_bat), GFP_KERNEL);
if (!twl4030_madc_bat)
@@ -216,9 +217,11 @@ static int twl4030_madc_battery_probe(struct platform_device *pdev)
twl4030_madc_bat->pdata = pdata;
platform_set_drvdata(pdev, twl4030_madc_bat);
- power_supply_register(&pdev->dev, &twl4030_madc_bat->psy);
+ ret = power_supply_register(&pdev->dev, &twl4030_madc_bat->psy);
+ if (ret < 0)
+ kfree(twl4030_madc_bat);
- return 0;
+ return ret;
}
static int twl4030_madc_battery_remove(struct platform_device *pdev)
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [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
end of thread, other threads:[~2015-02-25 21:22 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).