]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpufreq: s5pv210: fix refcount leak
authorShuhao Fu <sfual@cse.ust.hk>
Sun, 5 Oct 2025 19:31:17 +0000 (03:31 +0800)
committerViresh Kumar <viresh.kumar@linaro.org>
Thu, 23 Oct 2025 06:40:11 +0000 (12:10 +0530)
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>
drivers/cpufreq/s5pv210-cpufreq.c

index 4215621deb3fe8566d11029dc6fd6f1d2e191a9c..ba8a1c96427a105937919b2efd468c59ef469564 100644 (file)
@@ -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: