mirror of
https://github.com/curl/curl.git
synced 2024-11-21 01:16:58 +08:00
Curl_wait_for_resolv() could hang due to the bad timeout timer resolution and
some bad thinking on my part.
This commit is contained in:
parent
b83d8104cd
commit
1d0b5b507a
16
lib/hostip.c
16
lib/hostip.c
@ -621,6 +621,14 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
else if(conn->data->set.timeout)
|
||||
timeout = conn->data->set.timeout;
|
||||
|
||||
/* We convert the number of seconds into number of milliseconds here: */
|
||||
if(timeout < 2147483)
|
||||
/* maximum amount of seconds that can be multiplied with 1000 and
|
||||
still fit within 31 bits */
|
||||
timeout *= 1000;
|
||||
else
|
||||
timeout = 0x7fffffff; /* ridiculous amount of time anyway */
|
||||
|
||||
/* Wait for the name resolve query to complete. */
|
||||
while (1) {
|
||||
int nfds=0;
|
||||
@ -628,9 +636,10 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
struct timeval *tvp, tv, store;
|
||||
int count;
|
||||
struct timeval now = Curl_tvnow();
|
||||
long timediff;
|
||||
|
||||
store.tv_sec = (int)timeout;
|
||||
store.tv_usec = 0;
|
||||
store.tv_sec = (int)timeout/1000;
|
||||
store.tv_usec = (timeout%1000)*1000;
|
||||
|
||||
FD_ZERO(&read_fds);
|
||||
FD_ZERO(&write_fds);
|
||||
@ -645,7 +654,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
|
||||
|
||||
ares_process(data->state.areschannel, &read_fds, &write_fds);
|
||||
|
||||
timeout -= Curl_tvdiff(Curl_tvnow(), now)/1000; /* spent time */
|
||||
timediff = Curl_tvdiff(Curl_tvnow(), now); /* spent time */
|
||||
timeout -= timediff?timediff:1; /* always deduct at least 1 */
|
||||
if (timeout < 0) {
|
||||
/* our timeout, so we cancel the ares operation */
|
||||
ares_cancel(data->state.areschannel);
|
||||
|
Loading…
Reference in New Issue
Block a user