From d6b37d83f941c7b38336c62e06ff87157b3cf6ae Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 11 Feb 2016 23:52:43 +0100 Subject: 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 --- lib/timeval.c | 12 ++++++++++-- 1 file 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, , et al. + * Copyright (C) 1998 - 2016, Daniel Stenberg, , 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; } -- cgit v1.2.3