From f8f040e6596fa22b68198adf42dc6adcedfa57f0 Mon Sep 17 00:00:00 2001 From: Ryan Winograd Date: Mon, 26 Jun 2017 11:51:05 -0500 Subject: 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 --- lib/progress.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'lib') 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; -- cgit v1.2.3