diff options
-rw-r--r-- | RELEASE-NOTES | 2 | ||||
-rw-r--r-- | lib/connect.c | 9 |
2 files changed, 9 insertions, 2 deletions
diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 6b075f351..a45faafa4 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -81,6 +81,7 @@ This release includes the following bugfixes: o cmake: Fix generation of tool_hugehelp.c on windows o cmake: fix winsock2 detection on windows o gnutls: fix build with HTTP2 + o connect: fix a spurious connect failure on dual-stacked hosts [16] This release includes the following known bugs: @@ -117,3 +118,4 @@ References to bug reports and discussions on issues: [13] = http://curl.haxx.se/mail/lib-2015-02/0034.html [14] = http://curl.haxx.se/mail/lib-2015-01/0002.html [15] = https://github.com/bagder/curl/pull/139 + [16] = https://bugzilla.redhat.com/1187531 diff --git a/lib/connect.c b/lib/connect.c index 61b180825..904d3c935 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -753,6 +753,7 @@ CURLcode Curl_is_connected(struct connectdata *conn, } for(i=0; i<2; i++) { + const int other = i ^ 1; if(conn->tempsock[i] == CURL_SOCKET_BAD) continue; @@ -782,7 +783,6 @@ CURLcode Curl_is_connected(struct connectdata *conn, else if(rc == CURL_CSELECT_OUT) { if(verifyconnect(conn->tempsock[i], &error)) { /* we are connected with TCP, awesome! */ - int other = i ^ 1; /* use this socket from now on */ conn->sock[sockindex] = conn->tempsock[i]; @@ -824,6 +824,7 @@ CURLcode Curl_is_connected(struct connectdata *conn, data->state.os_errno = error; SET_SOCKERRNO(error); if(conn->tempaddr[i]) { + CURLcode status; char ipaddress[MAX_IPADR_LEN]; Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN); infof(data, "connect to %s port %ld failed: %s\n", @@ -832,7 +833,11 @@ CURLcode Curl_is_connected(struct connectdata *conn, conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ? allow : allow / 2; - result = trynextip(conn, sockindex, i); + status = trynextip(conn, sockindex, i); + if(status != CURLE_COULDNT_CONNECT + || conn->tempsock[other] == CURL_SOCKET_BAD) + /* the last attempt failed and no other sockets remain open */ + result = status; } } } |