Skip to content

Commit e651f2f

Browse files
xdarklightdlezcano
authored andcommitted
clocksource/drivers/arm_global_timer: Guard against division by zero
The result of the division of new_rate by gt_target_rate can be zero (if new_rate is smaller than gt_target_rate). Using that result as divisor without checking can result in a division by zero error. Guard against this by checking for a zero value earlier. While here, also change the psv variable to an unsigned long to make sure we don't overflow the datatype as all other types involved are also unsiged long. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Link: https://lore.kernel.org/r/20240225151336.2728533-3-martin.blumenstingl@googlemail.com
1 parent f31c204 commit e651f2f

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

drivers/clocksource/arm_global_timer.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,18 +291,17 @@ static int gt_clk_rate_change_cb(struct notifier_block *nb,
291291
switch (event) {
292292
case PRE_RATE_CHANGE:
293293
{
294-
int psv;
294+
unsigned long psv;
295295

296-
psv = DIV_ROUND_CLOSEST(ndata->new_rate,
297-
gt_target_rate);
298-
299-
if (abs(gt_target_rate - (ndata->new_rate / psv)) > MAX_F_ERR)
296+
psv = DIV_ROUND_CLOSEST(ndata->new_rate, gt_target_rate);
297+
if (!psv ||
298+
abs(gt_target_rate - (ndata->new_rate / psv)) > MAX_F_ERR)
300299
return NOTIFY_BAD;
301300

302301
psv--;
303302

304303
/* prescaler within legal range? */
305-
if (psv < 0 || psv > GT_CONTROL_PRESCALER_MAX)
304+
if (psv > GT_CONTROL_PRESCALER_MAX)
306305
return NOTIFY_BAD;
307306

308307
/*

0 commit comments

Comments
 (0)