Skip to content
Permalink
Browse files

tool_cb_prg: Fix integer overflow in progress bar

Commit 61faa0b fixed the progress bar
width calculation to avoid integer overflow, but failed to account for
the fact that initial_size is initialized to -1 when the file size is
retrieved from the remote on an upload, causing another signed integer
overflow.  Fix by separately checking for this case before the width
calculation.

Closes #3984
Reported-by: Brian Carpenter (Geeknik Labs)
Reviewed-by: Daniel Stenberg <daniel@haxx.se>
  • Loading branch information...
danielgustafsson committed Jun 10, 2019
1 parent deb9462 commit 6df5f35e6ac5f0f1adf7e5c7bf4bd2ec87b9d4bb
Showing with 9 additions and 4 deletions.
  1. +9 −4 src/tool_cb_prg.c
@@ -125,14 +125,19 @@ int tool_progress_cb(void *clientp,
curl_off_t total;
curl_off_t point;

/* expected transfer size */
if((CURL_OFF_T_MAX - bar->initial_size) < (dltotal + ultotal))
/* Calculate expected transfer size. initial_size can be less than zero
when indicating that we are expecting to get the filesize from the
remote */
if(bar->initial_size < 0 ||
((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 */
if((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow))
/* Calculate the current progress. initial_size can be less than zero when
indicating that we are expecting to get the filesize from the remote */
if(bar->initial_size < 0 ||
((CURL_OFF_T_MAX - bar->initial_size) < (dlnow + ulnow)))
point = CURL_OFF_T_MAX;
else
point = dlnow + ulnow + bar->initial_size;

0 comments on commit 6df5f35

Please sign in to comment.
You can’t perform that action at this time.