]> granicus.if.org Git - curl/commitdiff
connect: Try all addresses in first connection attempt
authorBjörn Stenberg <bjorn@haxx.se>
Sat, 28 Dec 2013 12:42:57 +0000 (13:42 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Sat, 28 Dec 2013 13:17:56 +0000 (13:17 +0000)
Fixes a bug when all addresses in the first family fail immediately, due
to "Network unreachable" for example, curl would hang and never try the
next address family.

Iterate through all address families when to trying establish the first
connection attempt.

Bug: http://curl.haxx.se/bug/view.cgi?id=1315
Reported-by: Michal Górny and Anthony G. Basile
lib/connect.c

index 4b6ee00a2e884d3b00b624d34dc898ec1b638ac6..588ac28b5588aab9578abe1731a90c1c6eac56ac 100644 (file)
@@ -1104,12 +1104,12 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
     conn->tempaddr[0]->ai_next == NULL ? timeout_ms : timeout_ms / 2;
 
   /* start connecting to first IP */
-  res = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
-  while(res != CURLE_OK &&
-        conn->tempaddr[0] &&
-        conn->tempaddr[0]->ai_next &&
-        conn->tempsock[0] == CURL_SOCKET_BAD)
-    res = trynextip(conn, FIRSTSOCKET, 0);
+  while(conn->tempaddr[0]) {
+    res = singleipconnect(conn, conn->tempaddr[0], &(conn->tempsock[0]));
+    if(res == CURLE_OK)
+        break;
+    conn->tempaddr[0] = conn->tempaddr[0]->ai_next;
+  }
 
   if(conn->tempsock[0] == CURL_SOCKET_BAD)
     return res;