transfer.c: break receive loop in speed limited transfers

- the change breaks looping in transfer.c receive for transfers that are
  speed limited on having gotten *some* bytes.
- the overall speed limit timing is done in multi.c

Reported-by: Dmitry Karpov
Bug: https://curl.se/mail/lib-2024-03/0001.html
Closes #13050
This commit is contained in:
Stefan Eissing 2024-03-05 11:08:55 +01:00 committed by Daniel Stenberg
parent 0ba47146f7
commit db5c9f4f9e
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -242,13 +242,14 @@ static CURLcode readwrite_data(struct Curl_easy *data,
buf = xfer_buf;
bytestoread = xfer_blen;
/* Observe any imposed speed limit */
if(bytestoread && data->set.max_recv_speed) {
curl_off_t net_limit = data->set.max_recv_speed - total_received;
if(net_limit <= 0)
/* In case of speed limit on receiving: if this loop already got
* data, break out. If not, limit the amount of bytes to receive.
* The overall, timed, speed limiting is done in multi.c */
if(total_received)
break;
if((size_t)net_limit < bytestoread)
bytestoread = (size_t)net_limit;
if((size_t)data->set.max_recv_speed < bytestoread)
bytestoread = (size_t)data->set.max_recv_speed;
}
nread = Curl_xfer_recv_resp(data, buf, bytestoread,