ntp: Verify offset doesn't overflow in ntp_update_offset
authorSasha Levin <sasha.levin@oracle.com>
Thu, 3 Dec 2015 20:46:48 +0000 (15:46 -0500)
committerJohn Stultz <john.stultz@linaro.org>
Fri, 11 Dec 2015 06:41:05 +0000 (22:41 -0800)
We need to make sure that the offset is valid before manipulating it,
otherwise it might overflow on the multiplication.

Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
[jstultz: Reworked one of the checks so it makes more sense]
Signed-off-by: John Stultz <john.stultz@linaro.org>
kernel/time/ntp.c

index 149cc8086aea16bbd811d3af37e187fd08bb366f..125fc034235531247d22618f2edc23bd40e5925b 100644 (file)
@@ -297,15 +297,17 @@ static void ntp_update_offset(long offset)
        if (!(time_status & STA_PLL))
                return;
 
-       if (!(time_status & STA_NANO))
+       if (!(time_status & STA_NANO)) {
+               /* Make sure the multiplication below won't overflow */
+               offset = clamp(offset, -USEC_PER_SEC, USEC_PER_SEC);
                offset *= NSEC_PER_USEC;
+       }
 
        /*
         * Scale the phase adjustment and
         * clamp to the operating range.
         */
-       offset = min(offset, MAXPHASE);
-       offset = max(offset, -MAXPHASE);
+       offset = clamp(offset, -MAXPHASE, MAXPHASE);
 
        /*
         * Select how the frequency is to be controlled