summaryrefslogtreecommitdiff
path: root/rts/posix
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2008-12-09 10:56:00 +0000
committerSimon Marlow <marlowsd@gmail.com>2008-12-09 10:56:00 +0000
commit31d797eb1b3c5aa07f928b58402529fd35b71bcc (patch)
tree9ca7b6859ed0067bd2b67fd448ce492af1caa6e8 /rts/posix
parent7fbdd9e0bccec89c958e2a1e36d5ec058fc69a3d (diff)
downloadhaskell-31d797eb1b3c5aa07f928b58402529fd35b71bcc.tar.gz
Fix #2848: avoid overflow during time calculation
Diffstat (limited to 'rts/posix')
-rw-r--r--rts/posix/Itimer.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/rts/posix/Itimer.c b/rts/posix/Itimer.c
index a60f8f1295..6b4ba3bb70 100644
--- a/rts/posix/Itimer.c
+++ b/rts/posix/Itimer.c
@@ -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));
}