The cpu variable is still being used in the of_get_property() call
after the of_node_put() call, which may result in use-after-free.
Fixes: a9acc26b75f ("cpufreq/pasemi: fix possible object reference leak")
Signed-off-by: Wen Yang <redacted>
Cc: "Rafael J. Wysocki" <redacted>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
v5: put together the code to get, use, and release cpu device_node.
v4: restore the blank line.
v3: fix a leaked reference.
v2: clean up the code according to the advice of viresh.
drivers/cpufreq/pasemi-cpufreq.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
@@ -131,10 +131,17 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)interr=-ENODEV;cpu=of_get_cpu_node(policy->cpu,NULL);--of_node_put(cpu);if(!cpu)gotoout;+max_freqp=of_get_property(cpu,"clock-frequency",NULL);+of_node_put(cpu);+if(!max_freqp){+err=-EINVAL;+gotoout;+}++/* we need the freq in kHz */+max_freq=*max_freqp/1000;dn=of_find_compatible_node(NULL,NULL,"1682m-sdc");if(!dn)
@@ -171,16 +178,6 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)}pr_debug("init cpufreq on CPU %d\n",policy->cpu);--max_freqp=of_get_property(cpu,"clock-frequency",NULL);-if(!max_freqp){-err=-EINVAL;-gotoout_unmap_sdcpwr;-}--/* we need the freq in kHz */-max_freq=*max_freqp/1000;-pr_debug("max clock-frequency is at %u kHz\n",max_freq);pr_debug("initializing frequency table\n");
The cpu variable is still being used in the of_get_property() call
after the of_node_put() call, which may result in use-after-free.
Fixes: a9acc26b75f ("cpufreq/pasemi: fix possible object reference leak")
Signed-off-by: Wen Yang <redacted>
Cc: "Rafael J. Wysocki" <redacted>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
v5: put together the code to get, use, and release cpu device_node.
v4: restore the blank line.
v3: fix a leaked reference.
v2: clean up the code according to the advice of viresh.
drivers/cpufreq/pasemi-cpufreq.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
@@ -131,10 +131,17 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)interr=-ENODEV;cpu=of_get_cpu_node(policy->cpu,NULL);--of_node_put(cpu);if(!cpu)gotoout;
I would have loved a blank line here :)
quoted hunk
+ max_freqp = of_get_property(cpu, "clock-frequency", NULL);+ of_node_put(cpu);+ if (!max_freqp) {+ err = -EINVAL;+ goto out;+ }++ /* we need the freq in kHz */+ max_freq = *max_freqp / 1000; dn = of_find_compatible_node(NULL, NULL, "1682m-sdc"); if (!dn)
@@ -171,16 +178,6 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) } pr_debug("init cpufreq on CPU %d\n", policy->cpu);-- max_freqp = of_get_property(cpu, "clock-frequency", NULL);- if (!max_freqp) {- err = -EINVAL;- goto out_unmap_sdcpwr;- }-- /* we need the freq in kHz */- max_freq = *max_freqp / 1000;- pr_debug("max clock-frequency is at %u kHz\n", max_freq); pr_debug("initializing frequency table\n");
From: Rafael J. Wysocki <hidden> Date: 2019-07-10 10:07:07
On Tuesday, July 9, 2019 10:12:05 AM CEST Viresh Kumar wrote:
On 09-07-19, 16:04, Wen Yang wrote:
quoted
The cpu variable is still being used in the of_get_property() call
after the of_node_put() call, which may result in use-after-free.
Fixes: a9acc26b75f ("cpufreq/pasemi: fix possible object reference leak")
Signed-off-by: Wen Yang <redacted>
Cc: "Rafael J. Wysocki" <redacted>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-pm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Patch applied.
quoted
---
v5: put together the code to get, use, and release cpu device_node.
v4: restore the blank line.
v3: fix a leaked reference.
v2: clean up the code according to the advice of viresh.
drivers/cpufreq/pasemi-cpufreq.c | 21 +++++++++------------
1 file changed, 9 insertions(+), 12 deletions(-)
@@ -131,10 +131,17 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy)interr=-ENODEV;cpu=of_get_cpu_node(policy->cpu,NULL);--of_node_put(cpu);if(!cpu)gotoout;
I would have loved a blank line here :)
And I added the blank line.
quoted
+ max_freqp = of_get_property(cpu, "clock-frequency", NULL);+ of_node_put(cpu);+ if (!max_freqp) {+ err = -EINVAL;+ goto out;+ }++ /* we need the freq in kHz */+ max_freq = *max_freqp / 1000; dn = of_find_compatible_node(NULL, NULL, "1682m-sdc"); if (!dn)
@@ -171,16 +178,6 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) } pr_debug("init cpufreq on CPU %d\n", policy->cpu);-- max_freqp = of_get_property(cpu, "clock-frequency", NULL);- if (!max_freqp) {- err = -EINVAL;- goto out_unmap_sdcpwr;- }-- /* we need the freq in kHz */- max_freq = *max_freqp / 1000;- pr_debug("max clock-frequency is at %u kHz\n", max_freq); pr_debug("initializing frequency table\n");
Though, enough versions have happened now.
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>