From 2d1ba75e1146f5f33d39370b24e6ef8d3b971db8 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 7 Oct 2013 15:37:34 +1100 Subject: [PATCH] Prevent overflows in us_tdiff and ms_tdiff. --- util.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/util.c b/util.c index ecece48d..b877e349 100644 --- a/util.c +++ b/util.c @@ -1071,13 +1071,19 @@ void cgsleep_us(int64_t us) /* Returns the microseconds difference between end and start times as a double */ double us_tdiff(struct timeval *end, struct timeval *start) { - return end->tv_sec * 1000000 + end->tv_usec - start->tv_sec * 1000000 - start->tv_usec; + /* Sanity check. We should only be using this for small differences so + * limit the max to 60 seconds. */ + if (unlikely(end->tv_sec - start->tv_sec > 60)) + return 60000000; + return (end->tv_sec - start->tv_sec) * 1000000 + (end->tv_usec - start->tv_usec); } /* Returns the milliseconds difference between end and start times */ int ms_tdiff(struct timeval *end, struct timeval *start) { - return end->tv_sec * 1000 + end->tv_usec / 1000 - start->tv_sec * 1000 - start->tv_usec / 1000; + if (unlikely(end->tv_sec - start->tv_sec > 60)) + return 60000; + return (end->tv_sec - start->tv_sec) * 1000 + (end->tv_usec - start->tv_usec) / 1000; } /* Returns the seconds difference between end and start times as a double */