Skip to content

Commit

Permalink
connect: wait for IPv4 connection attempts
Browse files Browse the repository at this point in the history
... even if the last IPv6 connection attempt has failed.

Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1187531#c4
  • Loading branch information
kdudka committed Feb 23, 2015
1 parent 92835ca commit e08a12d
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 2 deletions.
2 changes: 2 additions & 0 deletions RELEASE-NOTES
Expand Up @@ -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:

Expand Down Expand Up @@ -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
9 changes: 7 additions & 2 deletions lib/connect.c
Expand Up @@ -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;

Expand Down Expand Up @@ -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];
Expand Down Expand Up @@ -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",
Expand All @@ -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;
}
}
}
Expand Down

0 comments on commit e08a12d

Please sign in to comment.