diff options
author | Ryan Winograd <ryan@thewinograds.com> | 2017-06-26 11:51:05 -0500 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-06-30 09:05:53 +0200 |
commit | f8f040e6596fa22b68198adf42dc6adcedfa57f0 (patch) | |
tree | 6767d88452d7b5489a71bc25cec4139b4583e6cc /lib/progress.c | |
parent | ef2a9f22cc5e0139194de6fa57b9b09cd018b01a (diff) | |
download | curl-f8f040e6596fa22b68198adf42dc6adcedfa57f0.tar.gz |
progress: prevent resetting t_starttransfer
Prevent `Curl_pgrsTime` from modifying `t_starttransfer` when invoked
with `TIMER_STARTTRANSFER` more than once during a single request.
When a redirect occurs, this is considered a new request and
`t_starttransfer` can be updated to reflect the `t_starttransfer` time
of the redirect request.
Closes #1616
Bug: https://github.com/curl/curl/pull/1602#issuecomment-310267370
Diffstat (limited to 'lib/progress.c')
-rw-r--r-- | lib/progress.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/progress.c b/lib/progress.c index 457b4bd03..e92d96fdc 100644 --- a/lib/progress.c +++ b/lib/progress.c @@ -161,6 +161,9 @@ void Curl_pgrsResetTimesSizes(struct Curl_easy *data) Curl_pgrsSetUploadSize(data, -1); } +/* + * @unittest: 1399 + */ void Curl_pgrsTime(struct Curl_easy *data, timerid timer) { struct timeval now = Curl_tvnow(); @@ -196,7 +199,18 @@ void Curl_pgrsTime(struct Curl_easy *data, timerid timer) break; case TIMER_STARTTRANSFER: delta = &data->progress.t_starttransfer; - break; + /* prevent updating t_starttransfer unless: + * 1) this is the first time we're setting t_starttransfer + * 2) a redirect has occurred since the last time t_starttransfer was set + * This prevents repeated invocations of the function from incorrectly + * changing the t_starttransfer time. + */ + if (*delta > data->progress.t_redirect) { + return; + } + else { + break; + } case TIMER_POSTRANSFER: /* this is the normal end-of-transfer thing */ break; |