]> granicus.if.org Git - curl/commitdiff
curlx_tvdiff: handle 32bit time_t overflows
authorDaniel Stenberg <daniel@haxx.se>
Thu, 11 Feb 2016 22:52:43 +0000 (23:52 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 12 Feb 2016 07:13:03 +0000 (08:13 +0100)
On 32bit systems, make sure we don't overflow and return funky values
for very large time differences.

Reported-by: Anders Bakken
Closes #646

lib/timeval.c

index edd47af2b788c6296fae7fa53e5aa4ccbad89891..629f1c8f07f8073dedf0aa5605dcfe3c98fbe295 100644 (file)
@@ -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;
 }