From 5c52cacc98b838a891d0b0bb62c8d96a3377d60c Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 8 Oct 2003 13:32:43 +0000 Subject: [PATCH] - Frank Ticheler provided a patch that fixes how libcurl connects to multiple addresses, if one of them fails (ipv4-code). --- CHANGES | 4 ++++ RELEASE-NOTES | 5 +++-- lib/connect.c | 38 ++++++++++++++++++++------------------ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/CHANGES b/CHANGES index 38a4cd400..78b387187 100644 --- 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 diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 4aecc490e..150a902e0 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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) diff --git a/lib/connect.c b/lib/connect.c index 92298d3fe..2330e6418 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -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;