summaryrefslogtreecommitdiff
path: root/lib/formdata.c
diff options
context:
space:
mode:
authorPatrick Monnerat <patrick@monnerat.net>2020-03-06 09:46:39 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-03-07 23:26:00 +0100
commit96972ec1c00a142e3859efc82a06b0b810527da2 (patch)
treeb87cf6005d4815ee0ab7ff33f4e9d320e0d1cdad /lib/formdata.c
parent3dce9849be4f84df83ba342be24ce29f4fbe01d4 (diff)
downloadcurl-96972ec1c00a142e3859efc82a06b0b810527da2.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
Diffstat (limited to 'lib/formdata.c')
-rw-r--r--lib/formdata.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/lib/formdata.c b/lib/formdata.c
index 50a37e0e7..57ec6ad25 100644
--- a/lib/formdata.c
+++ b/lib/formdata.c
@@ -728,14 +728,10 @@ int curl_formget(struct curl_httppost *form, void *arg,
if(!nread)
break;
- switch(nread) {
- default:
- if(append(arg, buffer, nread) != nread)
- result = CURLE_READ_ERROR;
- break;
- case CURL_READFUNC_ABORT:
- case CURL_READFUNC_PAUSE:
- break;
+ if(nread > sizeof(buffer) || append(arg, buffer, nread) != nread) {
+ result = CURLE_READ_ERROR;
+ if(nread == CURL_READFUNC_ABORT)
+ result = CURLE_ABORTED_BY_CALLBACK;
}
}