Messages in this thread | | | Date | Wed, 8 Sep 2021 07:32:29 -0400 | From | Johannes Weiner <> | Subject | Re: [PATCH] psi: fix integer overflow on unsigned int multiply on 32 bit systems |
| |
CC Suren
On Mon, Sep 06, 2021 at 05:55:24PM +0530, Ravi Singh wrote: > 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>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
> --- > 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 >
| |