2012-10-13 01:58:34

by Jonghwan Choi

[permalink] [raw]
Subject: [PATCH] PM / Domains: Fix memory leak on error path in pm_genpd_attach_cpuidle

If pm_genpd_attach_cpudidle failed we leak memory stored in 'cpu_data'.

Signed-off-by: Jonghwan Choi <[email protected]>
---
drivers/base/power/domain.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c
index c22b869..96b71b6 100644
--- a/drivers/base/power/domain.c
+++ b/drivers/base/power/domain.c
@@ -1862,7 +1862,7 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain
*genpd, int state)
cpuidle_drv = cpuidle_driver_ref();
if (!cpuidle_drv) {
ret = -ENODEV;
- goto out;
+ goto err_drv;
}
if (cpuidle_drv->state_count <= state) {
ret = -EINVAL;
@@ -1884,6 +1884,9 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain
*genpd, int state)

err:
cpuidle_driver_unref();
+
+ err_drv:
+ kfree(cpu_data);
goto out;
}

--
1.7.1


2012-10-14 08:02:40

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: [PATCH] PM / Domains: Fix memory leak on error path in pm_genpd_attach_cpuidle

Hi,

Thanks for spotting the problem and for the patch (it got corrupted
in transfer, so please see if the one below is what you meant).

I'll queue it up for v3.7, but I'm travelling now, so it may take a while.

Thanks,
Rafael


> From: [email protected]
> Subject: PM / Domains: Fix memory leak on error path in pm_genpd_attach_cpuidle
>
> If pm_genpd_attach_cpudidle failed we leak memory stored in 'cpu_data'.
>
> Signed-off-by: Jonghwan Choi <[email protected]>
> ---
> drivers/base/power/domain.c | 5 ++++-
> 1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/base/power/domain.c b/drivers/base/power/domain.c index c22b869..96b71b6 100644
> --- a/drivers/base/power/domain.c
> +++ b/drivers/base/power/domain.c
> @@ -1862,7 +1862,7 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state)
> cpuidle_drv = cpuidle_driver_ref();
> if (!cpuidle_drv) {
> ret = -ENODEV;
> - goto out;
> + goto err_drv;
> }
> if (cpuidle_drv->state_count <= state) {
> ret = -EINVAL;
> @@ -1884,6 +1884,9 @@ int pm_genpd_attach_cpuidle(struct generic_pm_domain *genpd, int state)
>
> err:
> cpuidle_driver_unref();
> +
> + err_drv:
> + kfree(cpu_data);
> goto out;
> }
>
>

--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.