Commit 2de5cb96 authored by Shuhao Fu's avatar Shuhao Fu Committed by Viresh Kumar
Browse files

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.

Signed-off-by: default avatarShuhao Fu <sfual@cse.ust.hk>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 211ddde0
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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: