| From 70c41d37d770e892b889949dbe7361b5fc359a1e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 20 Sep 2022 14:08:26 +0800 |
| Subject: powercap: intel_rapl: fix UBSAN shift-out-of-bounds issue |
| |
| From: Chao Qin <chao.qin@intel.com> |
| |
| [ Upstream commit 2d93540014387d1c73b9ccc4d7895320df66d01b ] |
| |
| When value < time_unit, the parameter of ilog2() will be zero and |
| the return value is -1. u64(-1) is too large for shift exponent |
| and then will trigger shift-out-of-bounds: |
| |
| shift exponent 18446744073709551615 is too large for 32-bit type 'int' |
| Call Trace: |
| rapl_compute_time_window_core |
| rapl_write_data_raw |
| set_time_window |
| store_constraint_time_window_us |
| |
| Signed-off-by: Chao Qin <chao.qin@intel.com> |
| Acked-by: Zhang Rui <rui.zhang@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/powercap/intel_rapl.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/drivers/powercap/intel_rapl.c b/drivers/powercap/intel_rapl.c |
| index 8809c1a20bed..5f31606e1982 100644 |
| --- a/drivers/powercap/intel_rapl.c |
| +++ b/drivers/powercap/intel_rapl.c |
| @@ -1080,6 +1080,9 @@ static u64 rapl_compute_time_window_core(struct rapl_package *rp, u64 value, |
| y = value & 0x1f; |
| value = (1 << y) * (4 + f) * rp->time_unit / 4; |
| } else { |
| + if (value < rp->time_unit) |
| + return 0; |
| + |
| do_div(value, rp->time_unit); |
| y = ilog2(value); |
| f = div64_u64(4 * (value - (1 << y)), 1 << y); |
| -- |
| 2.35.1 |
| |