socks: Fix blocking timeout logic

- Document in Curl_timeleft's comment block that returning 0 signals no
  timeout (ie there's infinite time left).

- Fix SOCKS' Curl_blockread_all for the case when no timeout was set.

Prior to this change if the timeout had a value of 0 and that was passed
to SOCKET_READABLE it would return right away instead of blocking. That
was likely because it was not well understood that when Curl_timeleft
returns 0 it is not a timeout of 0 ms but actually means no timeout.

Ref: https://github.com/curl/curl/pull/5214#issuecomment-612512360

Closes https://github.com/curl/curl/pull/5220
This commit is contained in:
Jay Satiro 2020-04-11 23:19:55 -04:00
Родитель be28bc2241
Коммит 0510cce8c0
2 изменённых файлов: 7 добавлений и 6 удалений

Просмотреть файл

@ -171,7 +171,8 @@ singleipconnect(struct connectdata *conn,
/* /*
* Curl_timeleft() returns the amount of milliseconds left allowed for the * Curl_timeleft() returns the amount of milliseconds left allowed for the
* transfer/connection. If the value is negative, the timeout time has already * transfer/connection. If the value is 0, there's no timeout (ie there's
* infinite time left). If the value is negative, the timeout time has already
* elapsed. * elapsed.
* *
* The start time is stored in progress.t_startsingle - as set with * The start time is stored in progress.t_startsingle - as set with

Просмотреть файл

@ -62,15 +62,15 @@ int Curl_blockread_all(struct connectdata *conn, /* connection data */
int result; int result;
*n = 0; *n = 0;
for(;;) { for(;;) {
timediff_t timeleft = Curl_timeleft(conn->data, NULL, TRUE); timediff_t timeout_ms = Curl_timeleft(conn->data, NULL, TRUE);
if(timeleft < 0) { if(timeout_ms < 0) {
/* we already got the timeout */ /* we already got the timeout */
result = CURLE_OPERATION_TIMEDOUT; result = CURLE_OPERATION_TIMEDOUT;
break; break;
} }
if(timeleft > TIME_T_MAX) if(!timeout_ms || timeout_ms > TIME_T_MAX)
timeleft = TIME_T_MAX; timeout_ms = TIME_T_MAX;
if(SOCKET_READABLE(sockfd, (time_t)timeleft) <= 0) { if(SOCKET_READABLE(sockfd, (time_t)timeout_ms) <= 0) {
result = ~CURLE_OK; result = ~CURLE_OK;
break; break;
} }