cpufreq: s5pv210: fix refcount leak
Subsystems (2)
PATCH 1/1 cpufreq: s5pv210: fix refcount leak
In function s5pv210_cpu_init, a possible refcount inconsistency has been identified, causing a resource leak.
Why it is a bug:
1. For every clk_get, there should be a matching clk_put on every successive error handling path.
2. After calling clk_get(dmc1_clk), variable dmc1_clk will not be freed even if any error happens.
How it is fixed: For every failed path, an extra goto label is added to ensure dmc1_clk will be freed regardlessly.
--- drivers/cpufreq/s5pv210-cpufreq.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/cpufreq/s5pv210-cpufreq.c +4 -2
@@ -518,7 +518,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)if (policy->cpu !=0 ) { ret = -EINVAL ; - goto out_dmc1; + goto out; }/*
@@ -530,7 +530,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)if ((mem_type !=LPDDR ) && (mem_type !=LPDDR2 )) {pr_err ("CPUFreq doesn't support this memory type\n" ); ret = -EINVAL ; - goto out_dmc1; + goto out; }/* Find current refresh counter and frequency each DMC */
@@ -544,6 +544,8 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)cpufreq_generic_init (policy, s5pv210_freq_table,40000 );return 0 ; +out: +clk_put (dmc1_clk); out_dmc1:clk_put (dmc0_clk); out_dmc0:
Signature · 1 line
2.39.5
Quoted 40 lines · Shuhao Fu
In function
s5pv210_cpu_init, a possible refcount inconsistency has been identified, causing a resource leak.Why it is a bug:
1. For everyclk_get, there should be a matchingclk_puton every successive error handling path.
2. After callingclk_get(dmc1_clk), variabledmc1_clkwill not be freed even if any error happens.How it is fixed: For every failed path, an extra goto label is added to ensure
dmc1_clkwill be freed regardlessly.Signed-off-by Shuhao Fu <[email protected]>--- drivers/cpufreq/s5pv210-cpufreq.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)drivers/cpufreq/s5pv210-cpufreq.c +2
-2@@ -518,7 +518,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)if (policy->cpu !=0 ) { ret = -EINVAL ; - goto out_dmc1; + goto out; }/* @@ -530,7 +530,7 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)if ((mem_type !=LPDDR ) && (mem_type !=LPDDR2 )) {pr_err ("CPUFreq doesn't support this memory type\n" ); ret = -EINVAL ; - goto out_dmc1; + goto out; }/* Find current refresh counter and frequency each DMC */
drivers/cpufreq/s5pv210-cpufreq.c static int s5pv210_cpu_init(struct cpufreq_policy *policy) · line 551
Quoted 8 lines
drivers/cpufreq/s5pv210-cpufreq.c +2
-0@@ -544,6 +544,8 @@ static int s5pv210_cpu_init(struct cpufreq_policy *policy)cpufreq_generic_init (policy, s5pv210_freq_table,40000 );return 0 ; +out: +clk_put (dmc1_clk); out_dmc1:clk_put (dmc0_clk); out_dmc0:
Applied. Thanks.
Signature · 1 line
viresh