From ab6681c2c89ad985984e964c5d121340be011a91 Mon Sep 17 00:00:00 2001 From: Dirk Manske Date: Sat, 21 Aug 2010 00:29:35 +0200 Subject: Curl_is_connected: use correct errno The correctly extracted errno contents were mistakenly overwritten by a newer value that wasn't the correct error value. Bug: http://curl.haxx.se/mail/lib-2010-08/0242.html --- lib/connect.c | 45 ++++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/lib/connect.c b/lib/connect.c index 0495887b0..771129b5a 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -627,6 +627,7 @@ CURLcode Curl_is_connected(struct connectdata *conn, CURLcode code = CURLE_OK; curl_socket_t sockfd = conn->sock[sockindex]; long allow = DEFAULT_CONNECT_TIMEOUT; + int error = 0; DEBUGASSERT(sockindex >= FIRSTSOCKET && sockindex <= SECONDARYSOCKET); @@ -658,9 +659,11 @@ CURLcode Curl_is_connected(struct connectdata *conn, /* check for connect without timeout as we want to return immediately */ rc = waitconnect(conn, sockfd, 0); + if(WAITCONN_TIMEOUT == rc) + /* not an error, but also no connection yet */ + return code; if(WAITCONN_CONNECTED == rc) { - int error; if(verifyconnect(sockfd, &error)) { /* we are connected, awesome! */ conn->bits.tcpconnect = TRUE; @@ -672,38 +675,34 @@ CURLcode Curl_is_connected(struct connectdata *conn, return CURLE_OK; } /* nope, not connected for real */ - data->state.os_errno = error; - infof(data, "Connection failed\n"); - code = trynextip(conn, sockindex, connected); - if(code) - failf(data, "Failed connect to %s:%ld; %s", - conn->host.name, conn->port, Curl_strerror(conn, error)); } - else if(WAITCONN_TIMEOUT != rc) { - int error = 0; - + else { /* nope, not connected */ if(WAITCONN_FDSET_ERROR == rc) { (void)verifyconnect(sockfd, &error); - data->state.os_errno = error; - infof(data, "%s\n",Curl_strerror(conn,error)); + infof(data, "%s\n",Curl_strerror(conn, error)); } else infof(data, "Connection failed\n"); - - code = trynextip(conn, sockindex, connected); - - if(code) { - error = SOCKERRNO; - data->state.os_errno = error; - failf(data, "Failed connect to %s:%ld; %s", - conn->host.name, conn->port, Curl_strerror(conn, error)); - } } + /* - * If the connection failed here, we should attempt to connect to the "next - * address" for the given host. + * The connection failed here, we should attempt to connect to the "next + * address" for the given host. But first remember the latest error. */ + if(error) { + data->state.os_errno = error; + SET_SOCKERRNO(error); + } + + code = trynextip(conn, sockindex, connected); + + if(code) { + error = SOCKERRNO; + data->state.os_errno = error; + failf(data, "Failed connect to %s:%ld; %s", + conn->host.name, conn->port, Curl_strerror(conn, error)); + } return code; } -- cgit v1.2.3