]> granicus.if.org Git - curl/commitdiff
Curl_wait_for_resolv: correct timeout
authorDaniel Stenberg <daniel@haxx.se>
Sun, 5 Dec 2010 22:39:41 +0000 (23:39 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 5 Dec 2010 22:39:41 +0000 (23:39 +0100)
When looping in this function and checking for the timeout being
expired, it was not updating the reference time when calculating the
timediff since previous round which made it think each subsequent loop
to have taken longer than it actually did.

I also modified the function to use the generic Curl_timeleft() function
instead of the custom logic.

Bug: http://curl.haxx.se/bug/view.cgi?id=3112579

lib/hostares.c

index e31a677dac130ce796043f88a4b98ec00c4a7d6f..97cb27ab91e67a45d7b07277b2a1e8c8e7682e2d 100644 (file)
@@ -224,13 +224,8 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
   long timeout;
   struct timeval now = Curl_tvnow();
 
-  /* now, see if there's a connect timeout or a regular timeout to
-     use instead of the default one */
-  if(conn->data->set.connecttimeout)
-    timeout = conn->data->set.connecttimeout;
-  else if(conn->data->set.timeout)
-    timeout = conn->data->set.timeout;
-  else
+  timeout = Curl_timeleft(conn, &now, TRUE);
+  if(!timeout)
     timeout = CURL_TIMEOUT_RESOLVE * 1000; /* default name resolve timeout */
 
   /* Wait for the name resolve query to complete. */
@@ -265,8 +260,10 @@ CURLcode Curl_wait_for_resolv(struct connectdata *conn,
       timeout = -1; /* trigger the cancel below */
     }
     else {
-      timediff = Curl_tvdiff(Curl_tvnow(), now); /* spent time */
+      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 */