aboutsummaryrefslogtreecommitdiff
path: root/lib/timeval.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2016-02-11 23:52:43 +0100
committerDaniel Stenberg <daniel@haxx.se>2016-02-12 08:13:03 +0100
commitd6b37d83f941c7b38336c62e06ff87157b3cf6ae (patch)
tree229a0c5eaeea200dfd4390a2f5f389834c13bc27 /lib/timeval.c
parentd202fbcc002665f85a6716af918454aff767c0ba (diff)
curlx_tvdiff: handle 32bit time_t overflows
On 32bit systems, make sure we don't overflow and return funky values for very large time differences. Reported-by: Anders Bakken Closes #646
Diffstat (limited to 'lib/timeval.c')
-rw-r--r--lib/timeval.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/timeval.c b/lib/timeval.c
index edd47af2b..629f1c8f0 100644
--- a/lib/timeval.c
+++ b/lib/timeval.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -113,10 +113,18 @@ struct timeval curlx_tvnow(void)
* Make sure that the first argument is the more recent time, as otherwise
* we'll get a weird negative time-diff back...
*
- * Returns: the time difference in number of milliseconds.
+ * Returns: the time difference in number of milliseconds. For large diffs it
+ * returns 0x7fffffff on 32bit time_t systems.
*/
long curlx_tvdiff(struct timeval newer, struct timeval older)
{
+#if SIZEOF_TIME_T < 8
+ /* for 32bit time_t systems, add a precaution to avoid overflow for really
+ big time differences */
+ time_t diff = newer.tv_sec-older.tv_sec;
+ if(diff >= (0x7fffffff/1000))
+ return 0x7fffffff;
+#endif
return (newer.tv_sec-older.tv_sec)*1000+
(long)(newer.tv_usec-older.tv_usec)/1000;
}