Hey folks,I stumbled over this old code of ours that use 'long' to store number of seconds and number of milliseconds, while I think 'time_t' should be a better type for modern machines. Mostly because time_t is as large on 64 bits nix machines and long is still only 32 bits on Windows machines.
I'm thus suggesting the attached patch to transition some longs over to time_t to reduce the risk of integer overflows or truncating on windows.
-- / daniel.haxx.se
From 6b32311f8f353b849863505ab1985834d06b99fe Mon Sep 17 00:00:00 2001 From: Daniel Stenberg <[email protected]> Date: Fri, 11 Nov 2016 10:19:22 +0100 Subject: [PATCH] timeval: prefer time_t to hold seconds instead of long ... as long is still 32bit on modern 64bit windows machines, while time_t is generally 64bit. --- lib/progress.c | 36 +++++++++++++++++++----------------- lib/speedcheck.c | 6 +++--- lib/timeval.c | 6 +++--- lib/timeval.h | 6 +++--- lib/urldata.h | 4 ++-- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/lib/progress.c b/lib/progress.c index 0f67ef2..6d67e85 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -3,11 +3,11 @@ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2015, Daniel Stenberg, <[email protected]>, et al. + * Copyright (C) 1998 - 2016, Daniel Stenberg, <[email protected]>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * @@ -247,28 +247,30 @@ long Curl_pgrsLimitWaitTime(curl_off_t cursize, curl_off_t startsize, curl_off_t limit, struct timeval start, struct timeval now) { - curl_off_t size = cursize - startsize; - long minimum, actual; + curl_off_t size = cursize - startsize; + size_t minimum; + size_t actual; - /* we don't have a starting point yet -- return 0 so it gets (re)set */ - if(start.tv_sec == 0 && start.tv_usec == 0) - return 0; + /* we don't have a starting point yet -- return 0 so it gets (re)set */ + if(start.tv_sec == 0 && start.tv_usec == 0) + return 0; - /* not enough data yet */ - if(size < limit) - return -1; + /* not enough data yet */ + if(size < limit) + return -1; - minimum = (long) (CURL_OFF_T_C(1000) * size / limit); - actual = Curl_tvdiff(now, start); + minimum = (time_t) (CURL_OFF_T_C(1000) * size / limit); + actual = Curl_tvdiff(now, start); - if(actual < minimum) - return minimum - actual; - else - return 0; + if(actual < minimum) + /* this is a conversion on some systems (64bit time_t => 32bit long) */ + return (long)(minimum - actual); + else + return 0; } void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size) { struct timeval now = Curl_tvnow(); @@ -373,11 +375,11 @@ int Curl_pgrsUpdate(struct connectdata *conn) data->progress.ulspeed = (curl_off_t) ((double)data->progress.uploaded/ (data->progress.timespent>0?data->progress.timespent:1)); /* Calculations done at most once a second, unless end is reached */ - if(data->progress.lastshow != (long)now.tv_sec) { + if(data->progress.lastshow != now.tv_sec) { shownow = TRUE; data->progress.lastshow = now.tv_sec; /* Let's do the "current speed" thing, which should use the fastest @@ -400,11 +402,11 @@ int Curl_pgrsUpdate(struct connectdata *conn) countindex = ((data->progress.speeder_c>=CURR_TIME)? CURR_TIME:data->progress.speeder_c) - 1; /* first of all, we don't do this if there's no counted seconds yet */ if(countindex) { - long span_ms; + time_t span_ms; /* Get the index position to compare with the 'nowindex' position. Get the oldest entry possible. While we have less than CURR_TIME entries, the first entry will remain the oldest. */ checkindex = (data->progress.speeder_c>=CURR_TIME)? diff --git a/lib/speedcheck.c b/lib/speedcheck.c index 13c34af..bc15d97 100644 --- a/lib/speedcheck.c +++ b/lib/speedcheck.c @@ -3,11 +3,11 @@ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2014, Daniel Stenberg, <[email protected]>, et al. + * Copyright (C) 1998 - 2016, Daniel Stenberg, <[email protected]>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * @@ -38,12 +38,12 @@ CURLcode Curl_speedcheck(struct Curl_easy *data, { if((data->progress.current_speed >= 0) && data->set.low_speed_time && (Curl_tvlong(data->state.keeps_speed) != 0) && (data->progress.current_speed < data->set.low_speed_limit)) { - long howlong = Curl_tvdiff(now, data->state.keeps_speed); - long nextcheck = (data->set.low_speed_time * 1000) - howlong; + time_t howlong = Curl_tvdiff(now, data->state.keeps_speed); + time_t nextcheck = (data->set.low_speed_time * 1000) - howlong; /* We are now below the "low speed limit". If we are below it for "low speed time" seconds we consider that enough reason to abort the download. */ if(nextcheck <= 0) { diff --git a/lib/timeval.c b/lib/timeval.c index 629f1c8..f3b207a 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -114,21 +114,21 @@ struct timeval curlx_tvnow(void) * we'll get a weird negative time-diff back... * * 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) +time_t 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; + (time_t)(newer.tv_usec-older.tv_usec)/1000; } /* * Same as curlx_tvdiff but with full usec resolution. * @@ -142,9 +142,9 @@ double curlx_tvdiff_secs(struct timeval newer, struct timeval older) else return (double)(newer.tv_usec-older.tv_usec)/1000000.0; } /* return the number of seconds in the given input timeval struct */ -long Curl_tvlong(struct timeval t1) +time_t Curl_tvlong(struct timeval t1) { return t1.tv_sec; } diff --git a/lib/timeval.h b/lib/timeval.h index 50c31a2..09f8b3a 100644 --- a/lib/timeval.h +++ b/lib/timeval.h @@ -5,11 +5,11 @@ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2007, Daniel Stenberg, <[email protected]>, et al. + * Copyright (C) 1998 - 2016, Daniel Stenberg, <[email protected]>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at https://curl.haxx.se/docs/copyright.html. * @@ -35,20 +35,20 @@ struct timeval curlx_tvnow(void); * Make sure that the first argument (t1) is the more recent time and t2 is * the older time, as otherwise you get a weird negative time-diff back... * * Returns: the time difference in number of milliseconds. */ -long curlx_tvdiff(struct timeval t1, struct timeval t2); +time_t curlx_tvdiff(struct timeval t1, struct timeval t2); /* * Same as curlx_tvdiff but with full usec resolution. * * Returns: the time difference in seconds with subsecond resolution. */ double curlx_tvdiff_secs(struct timeval t1, struct timeval t2); -long Curl_tvlong(struct timeval t1); +time_t Curl_tvlong(struct timeval t1); /* These two defines below exist to provide the older API for library internals only. */ #define Curl_tvnow() curlx_tvnow() #define Curl_tvdiff(x,y) curlx_tvdiff(x,y) diff --git a/lib/urldata.h b/lib/urldata.h index 9384626..0aed9ea 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1144,12 +1144,12 @@ struct PureInfo { CURLOPT_CERTINFO / CURLINFO_CERTINFO */ }; struct Progress { - long lastshow; /* time() of the last displayed progress meter or NULL to - force redraw at next call */ + time_t lastshow; /* time() of the last displayed progress meter or NULL to + force redraw at next call */ curl_off_t size_dl; /* total expected size */ curl_off_t size_ul; /* total expected size */ curl_off_t downloaded; /* transferred so far */ curl_off_t uploaded; /* transferred so far */ -- 2.10.2
------------------------------------------------------------------- List admin: https://cool.haxx.se/list/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.html
