summaryrefslogtreecommitdiff
path: root/lib/formdata.c
diff options
context:
space:
mode:
authorPatrick Monnerat <patrick@monnerat.net>2020-01-21 01:33:04 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-03-02 00:00:50 +0100
commit87869e38d7afdec3ef1bb4965711458b088e254f (patch)
tree7da06feb40bf6ee89024a52f7f6a54fb33d44e8c /lib/formdata.c
parentcf1466bd473e06812dce0c3880f7e4af169e9e72 (diff)
downloadcurl-87869e38d7afdec3ef1bb4965711458b088e254f.tar.gz
mime: latch last read callback status.
In case a read callback returns a status (pause, abort, eof, error) instead of a byte count, drain the bytes read so far but remember this status for further processing. Takes care of not losing data when pausing, and properly resume a paused mime structure when requested. New tests 670-673 check unpausing cases, with easy or multi interface and mime or form api. Fixes #4813 Reported-by: MrdUkk on github Closes #4833
Diffstat (limited to 'lib/formdata.c')
-rw-r--r--lib/formdata.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/formdata.c b/lib/formdata.c
index 429d479da..6103959cd 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -730,11 +730,15 @@ int curl_formget(struct curl_httppost *form, void *arg,
switch(nread) {
default:
- if(append(arg, buffer, nread) != nread)
- result = CURLE_READ_ERROR;
- break;
+ if(append(arg, buffer, nread) == nread)
+ break;
+ /* FALLTHROUGH */
case CURL_READFUNC_ABORT:
- case CURL_READFUNC_PAUSE:
+ result = CURLE_ABORTED_BY_CALLBACK;
+ break;
+ case (size_t) -1: /* Read error. */
+ case CURL_READFUNC_PAUSE: /* Should not be paused. */
+ result = CURLE_READ_ERROR;
break;
}
}