aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--RELEASE-NOTES5
-rw-r--r--lib/connect.c38
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;