From cb5c7039e89fa3184f4f9396d8d9b967ee4f6256 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 13 Jun 2024 17:02:55 +0200 Subject: [PATCH] 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 --- lib/transfer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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; -- 2.47.3