Commit e08a12da authored by Kamil Dudka's avatar Kamil Dudka
Browse files

connect: wait for IPv4 connection attempts

... even if the last IPv6 connection attempt has failed.

Bug: https://bugzilla.redhat.com/show_bug.cgi?id=1187531#c4
parent 92835ca5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+7 −2
Original line number Diff line number Diff line
@@ -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;
      }
    }
  }