Ensure progress.size_dl/progress.size_ul are always >= 0
Historically the default "unknown" value for progress.size_dl and
progress.size_ul has been zero, since these values are initialized
implicitly by the calloc that allocates the curl handle that these
variables are a part of. Users of curl that install progress
callbacks may expect these values to always be >= 0.
Currently it is possible for progress.size_dl and progress.size_ul
to by set to a value of -1, if Curl_pgrsSetDownloadSize() or
Curl_pgrsSetUploadSize() are passed a "size" of -1 (which a few
places currently do, and a following patch will add more). So
lets update Curl_pgrsSetDownloadSize() and Curl_pgrsSetUploadSize()
so they make sure that these variables always contain a value that
is >= 0.
Updates test579 and test599.
Signed-off-by: Brandon Casey <drafnel@gmail.com>
diff --git a/lib/ftp.c b/lib/ftp.c
index 4c4396a..715afc2 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -4470,8 +4470,8 @@
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
ftpc->ctl_valid = TRUE; /* starts good */
diff --git a/lib/http.c b/lib/http.c
index 3fdab27..35baa34 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -2351,7 +2351,7 @@
return result;
http->postdata = NULL; /* nothing to post at this point */
- Curl_pgrsSetUploadSize(data, 0); /* upload size is 0 atm */
+ Curl_pgrsSetUploadSize(data, -1); /* upload size is unknown atm */
/* If 'authdone' is FALSE, we must not set the write socket index to the
Curl_transfer() call below, as we're not ready to actually upload any
diff --git a/lib/imap.c b/lib/imap.c
index e80bc03..9fc4728 100644
--- a/lib/imap.c
+++ b/lib/imap.c
@@ -1662,7 +1662,7 @@
(void)instate; /* no use for this yet */
if(imapcode != '*') {
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetDownloadSize(data, -1);
state(conn, IMAP_STOP);
return CURLE_REMOTE_FILE_NOT_FOUND; /* TODO: Fix error code */
}
@@ -2336,8 +2336,8 @@
/* Set the progress data */
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
/* Carry out the perform */
result = imap_perform(conn, &connected, dophase_done);
diff --git a/lib/pop3.c b/lib/pop3.c
index e69f5c5..dc64f81 100644
--- a/lib/pop3.c
+++ b/lib/pop3.c
@@ -1935,8 +1935,8 @@
/* Set the progress data */
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
/* Carry out the perform */
result = pop3_perform(conn, &connected, dophase_done);
diff --git a/lib/progress.c b/lib/progress.c
index e6a8d82..f147ce7 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -159,8 +159,8 @@
data->progress.t_pretransfer = 0.0;
data->progress.t_starttransfer = 0.0;
- Curl_pgrsSetDownloadSize(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
+ Curl_pgrsSetDownloadSize(data, -1);
+ Curl_pgrsSetUploadSize(data, -1);
}
void Curl_pgrsTime(struct SessionHandle *data, timerid timer)
@@ -234,20 +234,26 @@
void Curl_pgrsSetDownloadSize(struct SessionHandle *data, curl_off_t size)
{
- data->progress.size_dl = size;
- if(size >= 0)
+ if(size >= 0) {
+ data->progress.size_dl = size;
data->progress.flags |= PGRS_DL_SIZE_KNOWN;
- else
+ }
+ else {
+ data->progress.size_dl = 0;
data->progress.flags &= ~PGRS_DL_SIZE_KNOWN;
+ }
}
void Curl_pgrsSetUploadSize(struct SessionHandle *data, curl_off_t size)
{
- data->progress.size_ul = size;
- if(size >= 0)
+ if(size >= 0) {
+ data->progress.size_ul = size;
data->progress.flags |= PGRS_UL_SIZE_KNOWN;
- else
+ }
+ else {
+ data->progress.size_ul = 0;
data->progress.flags &= ~PGRS_UL_SIZE_KNOWN;
+ }
}
/*
diff --git a/lib/smtp.c b/lib/smtp.c
index 4dc7849..9aa8b15 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -2031,8 +2031,8 @@
/* Set the progress data */
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
/* Carry out the perform */
result = smtp_perform(conn, &connected, dophase_done);
diff --git a/lib/ssh.c b/lib/ssh.c
index b248b43..887e10f 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -2878,8 +2878,8 @@
Curl_pgrsSetUploadCounter(data, 0);
Curl_pgrsSetDownloadCounter(data, 0);
- Curl_pgrsSetUploadSize(data, 0);
- Curl_pgrsSetDownloadSize(data, 0);
+ Curl_pgrsSetUploadSize(data, -1);
+ Curl_pgrsSetDownloadSize(data, -1);
if(conn->handler->protocol & CURLPROTO_SCP)
res = scp_perform(conn, &connected, done);
diff --git a/tests/data/test579 b/tests/data/test579
index adbb3dd..e352e3d 100644
--- a/tests/data/test579
+++ b/tests/data/test579
@@ -77,12 +77,11 @@
<verify>
<file name="log/ip579">
Progress callback called with UL 0 out of 0
-Progress callback called with UL 0 out of -1
-Progress callback called with UL 8 out of -1
-Progress callback called with UL 16 out of -1
-Progress callback called with UL 26 out of -1
-Progress callback called with UL 61 out of -1
-Progress callback called with UL 66 out of -1
+Progress callback called with UL 8 out of 0
+Progress callback called with UL 16 out of 0
+Progress callback called with UL 26 out of 0
+Progress callback called with UL 61 out of 0
+Progress callback called with UL 66 out of 0
</file>
</verify>
</testcase>
diff --git a/tests/data/test599 b/tests/data/test599
index c57fe5c..9ce8b23 100644
--- a/tests/data/test599
+++ b/tests/data/test599
@@ -71,13 +71,15 @@
HTTP GET with progress callback and redirects changing content sizes
</name>
<command>
-http://%HOSTIP:%HTTPPORT/599
+http://%HOSTIP:%HTTPPORT/599 log/ip599
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
-
+<file name="log/ip599">
+CL: -1
+</file>
</verify>
</testcase>
diff --git a/tests/libtest/lib599.c b/tests/libtest/lib599.c
index 6b09267..08c536c 100644
--- a/tests/libtest/lib599.c
+++ b/tests/libtest/lib599.c
@@ -43,6 +43,7 @@
{
CURL *curl;
CURLcode res=CURLE_OK;
+ double content_length = 0.0;
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
fprintf(stderr, "curl_global_init() failed\n");
@@ -74,6 +75,17 @@
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
+ if (!res) {
+ FILE *moo;
+ res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,
+ &content_length);
+ moo = fopen(libtest_arg2, "wb");
+ if (moo) {
+ fprintf(moo, "CL: %.0f\n", content_length);
+ fclose(moo);
+ }
+ }
+
test_cleanup:
/* always cleanup */