Fix #2848: avoid overflow during time calculation
authorSimon Marlow <marlowsd@gmail.com>
Tue, 9 Dec 2008 10:56:00 +0000 (10:56 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 9 Dec 2008 10:56:00 +0000 (10:56 +0000)
rts/posix/Itimer.c

index a60f8f1..6b4ba3b 100644 (file)
@@ -264,7 +264,8 @@ getourtimeofday(void)
   interval = RtsFlags.MiscFlags.tickInterval;
   if (interval == 0) { interval = 50; }
   gettimeofday(&tv, (struct timezone *) NULL);
-       // cast to lnat because nat may be 64 bit when int is only 32 bit
-  return ((lnat)tv.tv_sec * 1000 / interval +
-         (lnat)tv.tv_usec / (interval * 1000));
+
+  // Avoid overflow when we multiply seconds by 1000.  See #2848
+  return (lnat)((StgWord64)tv.tv_sec * 1000 / interval +
+                (StgWord64)tv.tv_usec / (interval * 1000));
 }