summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-01-11 00:25:46 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-01-11 09:03:43 +0100
commit61faa0b420c236480bc9ef6fd52b4ecc1e0f8d17 (patch)
tree2f3fede99306a550e912144677b18009dfbedf8f /src
parent90254d0d65a6a99d3c970e64ad396610d51f69af (diff)
downloadcurl-61faa0b420c236480bc9ef6fd52b4ecc1e0f8d17.tar.gz
tool_cb_prg: avoid integer overflow
When calculating the progress bar width. Reported-by: Peng Li Fixes #3456 Closes #3458
Diffstat (limited to 'src')
-rw-r--r--src/tool_cb_prg.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/tool_cb_prg.c b/src/tool_cb_prg.c
index 15ff5b2fa..0539e9895 100644
--- a/src/tool_cb_prg.c
+++ b/src/tool_cb_prg.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, 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
@@ -106,6 +106,13 @@ static void fly(struct ProgressData *bar, bool moved)
#define MAX_BARLENGTH 256
+#if (SIZEOF_CURL_OFF_T == 4)
+# define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFF)
+#else
+ /* assume CURL_SIZEOF_CURL_OFF_T == 8 */
+# define CURL_OFF_T_MAX CURL_OFF_T_C(0x7FFFFFFFFFFFFFFF)
+#endif
+
int tool_progress_cb(void *clientp,
curl_off_t dltotal, curl_off_t dlnow,
curl_off_t ultotal, curl_off_t ulnow)
@@ -119,10 +126,16 @@ int tool_progress_cb(void *clientp,
curl_off_t point;
/* expected transfer size */
- total = dltotal + ultotal + bar->initial_size;
+ if((CURL_OFF_T_MAX - bar->initial_size) < (dltotal + ultotal))
+ total = CURL_OFF_T_MAX;
+ else
+ total = dltotal + ultotal + bar->initial_size;
/* we've come this far */
- point = dlnow + ulnow + bar->initial_size;
+ if((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow))
+ point = CURL_OFF_T_MAX;
+ else
+ point = dlnow + ulnow + bar->initial_size;
if(bar->calls) {
/* after first call... */