diff options
author | Daniel Stenberg <daniel@haxx.se> | 2017-03-06 22:45:10 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-03-07 07:38:29 +0100 |
commit | bfaab3180ca53d683d514b33a7967e7c7835eab7 (patch) | |
tree | 5d1c07abb343ea7a7bf56a597090e1b8c9610772 /lib | |
parent | f023f258fafa0ccf8ac013a927ec09bdebd101e0 (diff) |
ares: better error return on timeouts
Assisted-by: Ray Satiro
Bug: https://curl.haxx.se/mail/lib-2017-03/0009.html
Diffstat (limited to 'lib')
-rw-r--r-- | lib/asyn-ares.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c index ae73d0502..4baaef06a 100644 --- a/lib/asyn-ares.c +++ b/lib/asyn-ares.c @@ -368,7 +368,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, timeout = CURL_TIMEOUT_RESOLVE * 1000; /* default name resolve timeout */ /* Wait for the name resolve query to complete. */ - for(;;) { + while(!result) { struct timeval *tvp, tv, store; long timediff; int itimeout; @@ -390,28 +390,25 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn, timeout_ms = 1000; waitperform(conn, timeout_ms); - Curl_resolver_is_resolved(conn, &temp_entry); + result = Curl_resolver_is_resolved(conn, &temp_entry); - if(conn->async.done) + if(result || conn->async.done) break; - if(Curl_pgrsUpdate(conn)) { + if(Curl_pgrsUpdate(conn)) result = CURLE_ABORTED_BY_CALLBACK; - timeout = -1; /* trigger the cancel below */ - } else { struct timeval now2 = Curl_tvnow(); timediff = Curl_tvdiff(now2, now); /* spent time */ timeout -= timediff?timediff:1; /* always deduct at least 1 */ now = now2; /* for next loop */ } - - if(timeout < 0) { - /* our timeout, so we cancel the ares operation */ - ares_cancel((ares_channel)data->state.resolver); - break; - } + if(timeout < 0) + result = CURLE_OPERATION_TIMEDOUT; } + if(result) + /* failure, so we cancel the ares operation */ + ares_cancel((ares_channel)data->state.resolver); /* Operation complete, if the lookup was successful we now have the entry in the cache. */ |