From 96972ec1c00a142e3859efc82a06b0b810527da2 Mon Sep 17 00:00:00 2001 From: Patrick Monnerat Date: Fri, 6 Mar 2020 09:46:39 +0100 Subject: 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 --- lib/easy.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib/easy.c') diff --git a/lib/easy.c b/lib/easy.c index d3a29f48b..b648e80c1 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -1003,6 +1003,14 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action) return CURLE_OK; } + /* Unpause parts in active mime tree. */ + if((k->keepon & ~newstate & KEEP_SEND_PAUSE) && + (data->mstate == CURLM_STATE_PERFORM || + data->mstate == CURLM_STATE_TOOFAST) && + data->state.fread_func == (curl_read_callback) Curl_mime_read) { + Curl_mime_unpause(data->state.in); + } + /* put it back in the keepon */ k->keepon = newstate; -- cgit v1.2.1