From 87869e38d7afdec3ef1bb4965711458b088e254f Mon Sep 17 00:00:00 2001 From: Patrick Monnerat Date: Tue, 21 Jan 2020 01:33:04 +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 Closes #4833 --- lib/formdata.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/formdata.c') 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, , et al. + * Copyright (C) 1998 - 2020, Daniel Stenberg, , 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; } } -- cgit v1.2.3