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
This commit is contained in:
Daniel Stenberg 2024-06-13 17:02:55 +02:00
parent e5a35b493d
commit cb5c7039e8
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

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