Curl_is_connected: use correct errno
authorDirk Manske <dm@nonitor.de>
Fri, 20 Aug 2010 22:29:35 +0000 (00:29 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 20 Aug 2010 22:29:35 +0000 (00:29 +0200)
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

index 0495887b039f181ad2496292b41c358d462f24aa..771129b5a2ad7c8b7e9b2aab9ca72e2dc213dbd1 100644 (file)
@@ -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;
 }