aboutsummaryrefslogtreecommitdiff
path: root/lib/progress.c
diff options
context:
space:
mode:
authorRyan Winograd <ryan@thewinograds.com>2017-06-26 11:51:05 -0500
committerDaniel Stenberg <daniel@haxx.se>2017-06-30 09:05:53 +0200
commitf8f040e6596fa22b68198adf42dc6adcedfa57f0 (patch)
tree6767d88452d7b5489a71bc25cec4139b4583e6cc /lib/progress.c
parentef2a9f22cc5e0139194de6fa57b9b09cd018b01a (diff)
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.c16
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;