Messages in this thread Patch in this message | | | From | Ravi Singh <> | Subject | [PATCH] psi: fix integer overflow on unsigned int multiply on 32 bit systems | Date | Mon, 6 Sep 2021 17:55:24 +0530 |
| |
psi accepts window sizes upto WINDOW_MAX_US(10000000). In the case where window_us is larger than 4294967, the result of an multiplication overflows an unsigned int/long(4 bytes on 32 bit system).
For example, this can happen when the window_us is 5000000 so 5000000 * 1000 (NSEC_PER_USEC) will result in 5000000000 which is greater than UINT_MAX(4294967295). Due to this overflow, 705032704 is stored in t->win.size instead of 5000000000. Now psi will be monitoring the window size of 705 msecs instead of 5 secs as expected by user.
Fix this by type casting the first term of the mutiply to a u64.
Issue doesnot occur on 64 bit systems because NSEC_PER_USEC is of type long which is 8 bytes on 64 bit systems.
Signed-off-by: Ravi Singh <ravi.singh1@samsung.com> Signed-off-by: Vishal Goel <vishal.goel@samsung.com> --- kernel/sched/psi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/sched/psi.c b/kernel/sched/psi.c index 1652f2bb5..a2cc33dc2 100644 --- a/kernel/sched/psi.c +++ b/kernel/sched/psi.c @@ -1145,7 +1145,7 @@ struct psi_trigger *psi_trigger_create(struct psi_group *group, t->group = group; t->state = state; t->threshold = threshold_us * NSEC_PER_USEC; - t->win.size = window_us * NSEC_PER_USEC; + t->win.size = (u64)window_us * NSEC_PER_USEC; window_reset(&t->win, 0, 0, 0); t->event = 0; -- 2.17.1
| |