Commit 255826c4 authored by Björn Stenberg's avatar Björn Stenberg Committed by Daniel Stenberg
Browse files

bugfix: Don't block waiting for socket1 connect.

This patch fixes a bug in Happy Eyeballs where curl would wait for a
connect response from socket1 before checking socket2.

Also, it updates error messages for failed connections, showing the ip
addresses that failed rather than just the host name repeatedly.

Bug: http://curl.haxx.se/mail/lib-2013-10/0236.html
Reported-by: Paul Marks
parent 1d0eead9
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -747,9 +747,9 @@ CURLcode Curl_is_connected(struct connectdata *conn,
      if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
        infof(data, "After %ldms connect time, move on!\n",
              conn->timeoutms_per_addr);
        break;
        error = ETIMEDOUT;
      }
      return CURLE_OK;
      break;

    case CURL_CSELECT_OUT:
      if(verifyconnect(conn->tempsock[i], &error)) {
@@ -802,22 +802,25 @@ CURLcode Curl_is_connected(struct connectdata *conn,
     * address" for the given host. But first remember the latest error.
     */
    if(error) {
      char ipaddress[MAX_IPADR_LEN];
      data->state.os_errno = error;
      SET_SOCKERRNO(error);
    }
      Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN);
      infof(data, "connect to %s port %ld: %s\n",
            ipaddress, conn->port, Curl_strerror(conn, error));

      conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ?
                                 allow : allow / 2;

      code = trynextip(conn, sockindex, i, connected);
    }
  }

  if(code) {
      error = SOCKERRNO;
      data->state.os_errno = error;
      failf(data, "Failed connect to %s:%ld; %s",
    /* no more addresses to try */
    failf(data, "Failed to connect to %s port %ld: %s",
          conn->host.name, conn->port, Curl_strerror(conn, error));
  }
  }

  return code;
}