]> granicus.if.org Git - curl/commitdiff
- Frank Ticheler provided a patch that fixes how libcurl connects to multiple
authorDaniel Stenberg <daniel@haxx.se>
Wed, 8 Oct 2003 13:32:43 +0000 (13:32 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 8 Oct 2003 13:32:43 +0000 (13:32 +0000)
  addresses, if one of them fails (ipv4-code).

CHANGES
RELEASE-NOTES
lib/connect.c

diff --git a/CHANGES b/CHANGES
index 38a4cd400210536ea2c6278b3ff81b2078d260a9..78b387187e825c34a6e8bb5e348e58f3acecdf27 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,10 @@
                                   Changelog
 
 
+Daniel (8 October)
+- Frank Ticheler provided a patch that fixes how libcurl connects to multiple
+  addresses, if one of them fails (ipv4-code).
+
 Daniel (7 October)
 - Neil Dunbar provided a patch that now makes libcurl check SSL
   subjectAltNames when matching certs. This is apparently detailed in RFC2818
index 4aecc490e005ebbdf0690960ba59fe05f10e4bef..150a902e0faeb39666ec97921165d598e735b8ca 100644 (file)
@@ -19,7 +19,8 @@ This release includes the following changes:
 
 This release includes the following bugfixes:
 
- o libcurl checks subjectAltNames when matching certs
+ o fixed the ipv4 connect code when a DNS entry has multiple IPs
+ o now checks subjectAltNames when matching certs
  o HTTP POST using read callback works again
  o builds fine on BeOS now
  o CURLOPT_COOKIE set to NULL no longer sends the previously set cookie
@@ -64,6 +65,6 @@ advice from friends like these:
  Early Ehlinger, Kevin Fisk, Jurij Smakov, Bjorn Reese, Tim Bartley, David
  Kimdon, Dominick Meglio, Markus Moeller, Giuseppe Attardi, James MacMillan,
  Neil Spring, Siddhartha Prakash Jain, Jon Turner, Vincent Bronner, Shard,
- Jeremy Friesner, Florian Schoppmann, Neil Dunbar
+ Jeremy Friesner, Florian Schoppmann, Neil Dunbar, Frank Ticheler
  
         Thanks! (and sorry if I forgot to mention someone)
index 92298d3fee6baff006a4bd2807d098081d61a075..2330e64187d8d35402cef47f6e379f13030184ef 100644 (file)
@@ -620,23 +620,6 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
     failf(data, "no address available");
     return CURLE_COULDNT_CONNECT;
   }
-  /* create an IPv4 TCP socket */
-  sockfd = socket(AF_INET, SOCK_STREAM, 0);
-  if(-1 == sockfd) {
-    failf(data, "couldn't create socket");
-    return CURLE_COULDNT_CONNECT; /* big time error */
-  }
-  
-  if(conn->data->set.device) {
-    /* user selected to bind the outgoing socket to a specified "device"
-       before doing connect */
-    CURLcode res = bindlocal(conn, sockfd);
-    if(res)
-      return res;
-  }
-
-  /* Convert socket to non-blocking type */
-  Curl_nonblock(sockfd, TRUE);
 
   /* This is the loop that attempts to connect to all IP-addresses we
      know for the given host. One by one. */
@@ -645,6 +628,24 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
       aliasindex++) {
     struct sockaddr_in serv_addr;
 
+    /* create an IPv4 TCP socket */
+    sockfd = socket(AF_INET, SOCK_STREAM, 0);
+    if(-1 == sockfd) {
+      failf(data, "couldn't create socket");
+      return CURLE_COULDNT_CONNECT; /* big time error */
+    }
+  
+    if(conn->data->set.device) {
+      /* user selected to bind the outgoing socket to a specified "device"
+         before doing connect */
+      CURLcode res = bindlocal(conn, sockfd);
+      if(res)
+        return res;
+    }
+
+    /* Convert socket to non-blocking type */
+    Curl_nonblock(sockfd, TRUE);
+
     /* do this nasty work to do the connect */
     memset((char *) &serv_addr, '\0', sizeof(serv_addr));
     memcpy((char *)&(serv_addr.sin_addr),
@@ -706,6 +707,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
 
     if(0 != rc) {
       /* get a new timeout for next attempt */
+      sclose(sockfd);
       after = Curl_tvnow();
       timeout_ms -= Curl_tvdiff(after, before);
       if(timeout_ms < 0) {
@@ -717,9 +719,9 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
     }
     break;
   }
+
   if(0 != rc) {
     /* no good connect was made */
-    sclose(sockfd);
     *sockconn = -1;
     failf(data, "Connect failed");
     return CURLE_COULDNT_CONNECT;