All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
@ 2016-02-11 12:00 Javi Merino
  2016-02-11 15:00 ` Eduardo Valentin
  0 siblings, 1 reply; 9+ messages in thread
From: Javi Merino @ 2016-02-11 12:00 UTC (permalink / raw)
  To: akpm
  Cc: rui.zhang, edubezval, linux-pm, linux-kernel, drinkcat,
	Javi Merino, Amit Daniel Kachhap

In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
and time_in_idle_timestamp to be as big as the number of cpus in this
cpufreq device.  However, in get_load() we access this array using the
cpu number as index, which can result in an out of bound access.

Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
allowed_cpus mask, as we do for the load_cpu array in
cpufreq_get_requested_power()

Reported-by: Nicolas Boichat <drinkcat@chromium.org>
Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Javi Merino <javi.merino@arm.com>
---
Hi Andrew,

This patch fixes an out of bounds access found by Nicolas Boichat
using KASAN.  It is acked by Viresh, comaintainer of the cpu cooling
device and tested by the reporter.  It's been in the list[0] for more
than a month, I've pinged the thermal maintainers three times but they
haven't replied.

Can you merge it via your tree?  Thanks,
Javi

 drivers/thermal/cpu_cooling.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index e3fbc5a5d88f..bd1bab9eade0 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -377,26 +377,28 @@ static u32 cpu_power_to_freq(struct cpufreq_cooling_device *cpufreq_device,
  * get_load() - get load for a cpu since last updated
  * @cpufreq_device:	&struct cpufreq_cooling_device for this cpu
  * @cpu:	cpu number
+ * @cpu_idx:	index of the cpu in cpufreq_device->allowed_cpus
  *
  * Return: The average load of cpu @cpu in percentage since this
  * function was last called.
  */
-static u32 get_load(struct cpufreq_cooling_device *cpufreq_device, int cpu)
+static u32 get_load(struct cpufreq_cooling_device *cpufreq_device, int cpu,
+                    int cpu_idx)
 {
 	u32 load;
 	u64 now, now_idle, delta_time, delta_idle;
 
 	now_idle = get_cpu_idle_time(cpu, &now, 0);
-	delta_idle = now_idle - cpufreq_device->time_in_idle[cpu];
-	delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu];
+	delta_idle = now_idle - cpufreq_device->time_in_idle[cpu_idx];
+	delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu_idx];
 
 	if (delta_time <= delta_idle)
 		load = 0;
 	else
 		load = div64_u64(100 * (delta_time - delta_idle), delta_time);
 
-	cpufreq_device->time_in_idle[cpu] = now_idle;
-	cpufreq_device->time_in_idle_timestamp[cpu] = now;
+	cpufreq_device->time_in_idle[cpu_idx] = now_idle;
+	cpufreq_device->time_in_idle_timestamp[cpu_idx] = now;
 
 	return load;
 }
@@ -598,7 +600,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev,
 		u32 load;
 
 		if (cpu_online(cpu))
-			load = get_load(cpufreq_device, cpu);
+			load = get_load(cpufreq_device, cpu, i);
 		else
 			load = 0;
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2016-02-11 12:00 [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle Javi Merino
@ 2016-02-11 15:00 ` Eduardo Valentin
  2016-02-11 18:45   ` Javi Merino
  0 siblings, 1 reply; 9+ messages in thread
From: Eduardo Valentin @ 2016-02-11 15:00 UTC (permalink / raw)
  To: Javi Merino
  Cc: akpm, rui.zhang, linux-pm, linux-kernel, drinkcat, Amit Daniel Kachhap

On Thu, Feb 11, 2016 at 12:00:51PM +0000, Javi Merino wrote:
> In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> and time_in_idle_timestamp to be as big as the number of cpus in this
> cpufreq device.  However, in get_load() we access this array using the
> cpu number as index, which can result in an out of bound access.
> 
> Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> allowed_cpus mask, as we do for the load_cpu array in
> cpufreq_get_requested_power()
> 
> Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> Cc: Zhang Rui <rui.zhang@intel.com>
> Cc: Eduardo Valentin <edubezval@gmail.com>
> Tested-by: Nicolas Boichat <drinkcat@chromium.org>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> Signed-off-by: Javi Merino <javi.merino@arm.com>


> ---
> Hi Andrew,
> 
> This patch fixes an out of bounds access found by Nicolas Boichat
> using KASAN.  It is acked by Viresh, comaintainer of the cpu cooling
> device and tested by the reporter.  It's been in the list[0] for more
> than a month, I've pinged the thermal maintainers three times but they
> haven't replied.
> 
> Can you merge it via your tree?  Thanks,
> Javi

Somehow this patch was marked as accepted in patchwork and I missed it,
apologize for this. I am adding it to thermal-soc.

BR,
Eduardo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2016-02-11 15:00 ` Eduardo Valentin
@ 2016-02-11 18:45   ` Javi Merino
  0 siblings, 0 replies; 9+ messages in thread
From: Javi Merino @ 2016-02-11 18:45 UTC (permalink / raw)
  To: Eduardo Valentin
  Cc: akpm, rui.zhang, linux-pm, linux-kernel, drinkcat, Amit Daniel Kachhap

On Thu, Feb 11, 2016 at 07:00:28AM -0800, Eduardo Valentin wrote:
> On Thu, Feb 11, 2016 at 12:00:51PM +0000, Javi Merino wrote:
> > In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> > and time_in_idle_timestamp to be as big as the number of cpus in this
> > cpufreq device.  However, in get_load() we access this array using the
> > cpu number as index, which can result in an out of bound access.
> > 
> > Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> > allowed_cpus mask, as we do for the load_cpu array in
> > cpufreq_get_requested_power()
> > 
> > Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> > Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> > Cc: Zhang Rui <rui.zhang@intel.com>
> > Cc: Eduardo Valentin <edubezval@gmail.com>
> > Tested-by: Nicolas Boichat <drinkcat@chromium.org>
> > Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> > Signed-off-by: Javi Merino <javi.merino@arm.com>
> 
> 
> > ---
> > Hi Andrew,
> > 
> > This patch fixes an out of bounds access found by Nicolas Boichat
> > using KASAN.  It is acked by Viresh, comaintainer of the cpu cooling
> > device and tested by the reporter.  It's been in the list[0] for more
> > than a month, I've pinged the thermal maintainers three times but they
> > haven't replied.
> > 
> > Can you merge it via your tree?  Thanks,
> > Javi
> 
> Somehow this patch was marked as accepted in patchwork and I missed it,
> apologize for this. I am adding it to thermal-soc.

Great, thanks!
Javi

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2016-01-18  2:25       ` Nicolas Boichat
@ 2016-01-25 14:44         ` Javi Merino
  0 siblings, 0 replies; 9+ messages in thread
From: Javi Merino @ 2016-01-25 14:44 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: Nicolas Boichat, linux-pm, linux-kernel, Amit Daniel Kachhap,
	Viresh Kumar

On Mon, Jan 18, 2016 at 10:25:35AM +0800, Nicolas Boichat wrote:
> On Fri, Jan 15, 2016 at 11:20 PM, Javi Merino <javi.merino@arm.com> wrote:
> > Eduardo, Rui,
> >
> > On Tue, Jan 05, 2016 at 07:19:25PM +0000, Javi Merino wrote:
> >> On Mon, Dec 21, 2015 at 08:49:40AM +0530, Viresh Kumar wrote:
> >> > On 19-12-15, 12:54, Javi Merino wrote:
> >> > > In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> >> > > and time_in_idle_timestamp to be as big as the number of cpus in this
> >> > > cpufreq device.  However, in get_load() we access this array using the
> >> > > cpu number as index, which can result in an out of bound access.
> >> > >
> >> > > Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> >> > > allowed_cpus mask, as we do for the load_cpu array in
> >> > > cpufreq_get_requested_power()
> >> > >
> >> > > Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> >> > > Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> >> > > Cc: Viresh Kumar <viresh.kumar@linaro.org>
> >> > > Cc: Zhang Rui <rui.zhang@intel.com>
> >> > > Cc: Eduardo Valentin <edubezval@gmail.com>
> >> > > Signed-off-by: Javi Merino <javi.merino@arm.com>
> >> > > ---
> >> > >  drivers/thermal/cpu_cooling.c | 14 ++++++++------
> >> > >  1 file changed, 8 insertions(+), 6 deletions(-)
> >> >
> >> > Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> >>
> >> If there are no more objections, can you pick this up?
> >
> > Another gentle ping, can this be merged?
> 
> Tested-by: Nicolas Boichat <drinkcat@chromium.org>

Eduardo, Rui,

This has been in the list for more than a month now.  It fixes an out
of bounds access.  It has been acked by Viresh (comaintainer of
cpu_cooling) and has been tested by Nicolas.  Can you guys merge it
please?

Cheers,
Javi 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2016-01-15 15:20     ` Javi Merino
@ 2016-01-18  2:25       ` Nicolas Boichat
  2016-01-25 14:44         ` Javi Merino
  0 siblings, 1 reply; 9+ messages in thread
From: Nicolas Boichat @ 2016-01-18  2:25 UTC (permalink / raw)
  To: Javi Merino
  Cc: Zhang Rui, Eduardo Valentin, linux-pm, linux-kernel,
	Amit Daniel Kachhap, Viresh Kumar

On Fri, Jan 15, 2016 at 11:20 PM, Javi Merino <javi.merino@arm.com> wrote:
> Eduardo, Rui,
>
> On Tue, Jan 05, 2016 at 07:19:25PM +0000, Javi Merino wrote:
>> On Mon, Dec 21, 2015 at 08:49:40AM +0530, Viresh Kumar wrote:
>> > On 19-12-15, 12:54, Javi Merino wrote:
>> > > In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
>> > > and time_in_idle_timestamp to be as big as the number of cpus in this
>> > > cpufreq device.  However, in get_load() we access this array using the
>> > > cpu number as index, which can result in an out of bound access.
>> > >
>> > > Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
>> > > allowed_cpus mask, as we do for the load_cpu array in
>> > > cpufreq_get_requested_power()
>> > >
>> > > Reported-by: Nicolas Boichat <drinkcat@chromium.org>
>> > > Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
>> > > Cc: Viresh Kumar <viresh.kumar@linaro.org>
>> > > Cc: Zhang Rui <rui.zhang@intel.com>
>> > > Cc: Eduardo Valentin <edubezval@gmail.com>
>> > > Signed-off-by: Javi Merino <javi.merino@arm.com>
>> > > ---
>> > >  drivers/thermal/cpu_cooling.c | 14 ++++++++------
>> > >  1 file changed, 8 insertions(+), 6 deletions(-)
>> >
>> > Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
>>
>> If there are no more objections, can you pick this up?
>
> Another gentle ping, can this be merged?

Tested-by: Nicolas Boichat <drinkcat@chromium.org>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2016-01-05 19:19   ` Javi Merino
@ 2016-01-15 15:20     ` Javi Merino
  2016-01-18  2:25       ` Nicolas Boichat
  0 siblings, 1 reply; 9+ messages in thread
From: Javi Merino @ 2016-01-15 15:20 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: linux-pm, linux-kernel, Amit Daniel Kachhap, Viresh Kumar

Eduardo, Rui,

On Tue, Jan 05, 2016 at 07:19:25PM +0000, Javi Merino wrote:
> On Mon, Dec 21, 2015 at 08:49:40AM +0530, Viresh Kumar wrote:
> > On 19-12-15, 12:54, Javi Merino wrote:
> > > In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> > > and time_in_idle_timestamp to be as big as the number of cpus in this
> > > cpufreq device.  However, in get_load() we access this array using the
> > > cpu number as index, which can result in an out of bound access.
> > > 
> > > Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> > > allowed_cpus mask, as we do for the load_cpu array in
> > > cpufreq_get_requested_power()
> > > 
> > > Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> > > Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> > > Cc: Viresh Kumar <viresh.kumar@linaro.org>
> > > Cc: Zhang Rui <rui.zhang@intel.com>
> > > Cc: Eduardo Valentin <edubezval@gmail.com>
> > > Signed-off-by: Javi Merino <javi.merino@arm.com>
> > > ---
> > >  drivers/thermal/cpu_cooling.c | 14 ++++++++------
> > >  1 file changed, 8 insertions(+), 6 deletions(-)
> > 
> > Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
> 
> If there are no more objections, can you pick this up?

Another gentle ping, can this be merged?

Thanks,
Javi

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2015-12-21  3:19 ` Viresh Kumar
@ 2016-01-05 19:19   ` Javi Merino
  2016-01-15 15:20     ` Javi Merino
  0 siblings, 1 reply; 9+ messages in thread
From: Javi Merino @ 2016-01-05 19:19 UTC (permalink / raw)
  To: Zhang Rui, Eduardo Valentin
  Cc: linux-pm, linux-kernel, Amit Daniel Kachhap, Viresh Kumar

Eduardo, Rui,

On Mon, Dec 21, 2015 at 08:49:40AM +0530, Viresh Kumar wrote:
> On 19-12-15, 12:54, Javi Merino wrote:
> > In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> > and time_in_idle_timestamp to be as big as the number of cpus in this
> > cpufreq device.  However, in get_load() we access this array using the
> > cpu number as index, which can result in an out of bound access.
> > 
> > Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> > allowed_cpus mask, as we do for the load_cpu array in
> > cpufreq_get_requested_power()
> > 
> > Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> > Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> > Cc: Viresh Kumar <viresh.kumar@linaro.org>
> > Cc: Zhang Rui <rui.zhang@intel.com>
> > Cc: Eduardo Valentin <edubezval@gmail.com>
> > Signed-off-by: Javi Merino <javi.merino@arm.com>
> > ---
> >  drivers/thermal/cpu_cooling.c | 14 ++++++++------
> >  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

If there are no more objections, can you pick this up?

Thanks,
Javi

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
  2015-12-19 12:54 Javi Merino
@ 2015-12-21  3:19 ` Viresh Kumar
  2016-01-05 19:19   ` Javi Merino
  0 siblings, 1 reply; 9+ messages in thread
From: Viresh Kumar @ 2015-12-21  3:19 UTC (permalink / raw)
  To: Javi Merino
  Cc: linux-pm, linux-kernel, Amit Daniel Kachhap, Zhang Rui, Eduardo Valentin

On 19-12-15, 12:54, Javi Merino wrote:
> In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
> and time_in_idle_timestamp to be as big as the number of cpus in this
> cpufreq device.  However, in get_load() we access this array using the
> cpu number as index, which can result in an out of bound access.
> 
> Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
> allowed_cpus mask, as we do for the load_cpu array in
> cpufreq_get_requested_power()
> 
> Reported-by: Nicolas Boichat <drinkcat@chromium.org>
> Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
> Cc: Viresh Kumar <viresh.kumar@linaro.org>
> Cc: Zhang Rui <rui.zhang@intel.com>
> Cc: Eduardo Valentin <edubezval@gmail.com>
> Signed-off-by: Javi Merino <javi.merino@arm.com>
> ---
>  drivers/thermal/cpu_cooling.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

-- 
viresh

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle
@ 2015-12-19 12:54 Javi Merino
  2015-12-21  3:19 ` Viresh Kumar
  0 siblings, 1 reply; 9+ messages in thread
From: Javi Merino @ 2015-12-19 12:54 UTC (permalink / raw)
  To: linux-pm
  Cc: linux-kernel, Javi Merino, Amit Daniel Kachhap, Viresh Kumar,
	Zhang Rui, Eduardo Valentin

In __cpufreq_cooling_register() we allocate the arrays for time_in_idle
and time_in_idle_timestamp to be as big as the number of cpus in this
cpufreq device.  However, in get_load() we access this array using the
cpu number as index, which can result in an out of bound access.

Index time_in_idle{,_timestamp} using the index in the cpufreq_device's
allowed_cpus mask, as we do for the load_cpu array in
cpufreq_get_requested_power()

Reported-by: Nicolas Boichat <drinkcat@chromium.org>
Cc: Amit Daniel Kachhap <amit.kachhap@gmail.com>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Eduardo Valentin <edubezval@gmail.com>
Signed-off-by: Javi Merino <javi.merino@arm.com>
---
 drivers/thermal/cpu_cooling.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c
index e3fbc5a5d88f..bd1bab9eade0 100644
--- a/drivers/thermal/cpu_cooling.c
+++ b/drivers/thermal/cpu_cooling.c
@@ -377,26 +377,28 @@ static u32 cpu_power_to_freq(struct cpufreq_cooling_device *cpufreq_device,
  * get_load() - get load for a cpu since last updated
  * @cpufreq_device:	&struct cpufreq_cooling_device for this cpu
  * @cpu:	cpu number
+ * @cpu_idx:	index of the cpu in cpufreq_device->allowed_cpus
  *
  * Return: The average load of cpu @cpu in percentage since this
  * function was last called.
  */
-static u32 get_load(struct cpufreq_cooling_device *cpufreq_device, int cpu)
+static u32 get_load(struct cpufreq_cooling_device *cpufreq_device, int cpu,
+                    int cpu_idx)
 {
 	u32 load;
 	u64 now, now_idle, delta_time, delta_idle;
 
 	now_idle = get_cpu_idle_time(cpu, &now, 0);
-	delta_idle = now_idle - cpufreq_device->time_in_idle[cpu];
-	delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu];
+	delta_idle = now_idle - cpufreq_device->time_in_idle[cpu_idx];
+	delta_time = now - cpufreq_device->time_in_idle_timestamp[cpu_idx];
 
 	if (delta_time <= delta_idle)
 		load = 0;
 	else
 		load = div64_u64(100 * (delta_time - delta_idle), delta_time);
 
-	cpufreq_device->time_in_idle[cpu] = now_idle;
-	cpufreq_device->time_in_idle_timestamp[cpu] = now;
+	cpufreq_device->time_in_idle[cpu_idx] = now_idle;
+	cpufreq_device->time_in_idle_timestamp[cpu_idx] = now;
 
 	return load;
 }
@@ -598,7 +600,7 @@ static int cpufreq_get_requested_power(struct thermal_cooling_device *cdev,
 		u32 load;
 
 		if (cpu_online(cpu))
-			load = get_load(cpufreq_device, cpu);
+			load = get_load(cpufreq_device, cpu, i);
 		else
 			load = 0;
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-02-11 18:45 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-11 12:00 [PATCH] thermal: cpu_cooling: fix out of bounds access in time_in_idle Javi Merino
2016-02-11 15:00 ` Eduardo Valentin
2016-02-11 18:45   ` Javi Merino
  -- strict thread matches above, loose matches on Subject: below --
2015-12-19 12:54 Javi Merino
2015-12-21  3:19 ` Viresh Kumar
2016-01-05 19:19   ` Javi Merino
2016-01-15 15:20     ` Javi Merino
2016-01-18  2:25       ` Nicolas Boichat
2016-01-25 14:44         ` Javi Merino

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.