From: Daniel Stenberg Date: Thu, 13 Jun 2024 15:02:55 +0000 (+0200) Subject: transfer: set CSELECT_IN if there is data pending X-Git-Tag: curl-8_9_0~237 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb5c7039e89fa3184f4f9396d8d9b967ee4f6256;p=thirdparty%2Fcurl.git transfer: set CSELECT_IN if there is data pending When aborting the transfer loop early, like when there is rate limiting in effect, there might be buffered data already read off the socket so the socket might not signal reability. Therefore we must set the CSELECT_IN manually if data_pending_() suggests there might be more data to get. This is particularly noticeable with SSH when the underlying library has drained the socket and holds pending data in its buffer. Reported-by: alervd on github Fixes #13695 Closes #13943 --- diff --git a/lib/transfer.c b/lib/transfer.c index ee4abe65b5..90ae8dbfbb 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -338,8 +338,9 @@ static CURLcode readwrite_data(struct Curl_easy *data, } while(maxloops-- && data_pending(data)); - if(maxloops <= 0) { - /* did not read until EAGAIN, mark read-again-please */ + if((maxloops <= 0) || data_pending(data)) { + /* did not read until EAGAIN or there is still pending data, mark as + read-again-please */ data->state.select_bits = CURL_CSELECT_IN; if((k->keepon & KEEP_SENDBITS) == KEEP_SEND) data->state.select_bits |= CURL_CSELECT_OUT;