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
This commit is contained in:
Patrick Monnerat 2020-01-21 01:33:04 +01:00 committed by Daniel Stenberg
parent cf1466bd47
commit 87869e38d7
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
13 changed files with 616 additions and 12 deletions

View file

@ -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;
}
}