| From ba83da62121d8d0702dca75defa9cc255340111c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 6 Oct 2025 03:31:17 +0800 |
| Subject: cpufreq: s5pv210: fix refcount leak |
| |
| From: Shuhao Fu <sfual@cse.ust.hk> |
| |
| [ Upstream commit 2de5cb96060a1664880d65b120e59485a73588a8 ] |
| |
| 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. |
| |
| Signed-off-by: Shuhao Fu <sfual@cse.ust.hk> |
| Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/cpufreq/s5pv210-cpufreq.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/cpufreq/s5pv210-cpufreq.c b/drivers/cpufreq/s5pv210-cpufreq.c |
| index bed496cf8d247..f95b4658097a6 100644 |
| --- a/drivers/cpufreq/s5pv210-cpufreq.c |
| +++ b/drivers/cpufreq/s5pv210-cpufreq.c |
| @@ -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: |
| -- |
| 2.51.0 |
| |