connect: Close open but unconnected socket in singleipconnect()
authorSteve Holme <steve_holme@hotmail.com>
Sat, 16 Nov 2013 22:56:11 +0000 (22:56 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 17 Nov 2013 00:27:18 +0000 (00:27 +0000)
singleipconnect() could return the file descriptor of an open socket
even though the function returned a CURLE_COULDNT_CONNECT error code
from commit ed1662c374361a and 02fbc26d59c591.

This could cause tests 19, 704 and 1233 to fail on FreeBSD, AIX and
Solaris.

lib/connect.c

index e4d4fee..3cbca1b 100644 (file)
@@ -562,6 +562,7 @@ static CURLcode trynextip(struct connectdata *conn,
 
     while(ai && ai->ai_family != family)
       ai = ai->ai_next;
+
     if(ai) {
       rc = singleipconnect(conn, ai, &conn->tempsock[tempindex]);
       conn->tempaddr[tempindex] = ai;
@@ -1027,10 +1028,8 @@ singleipconnect(struct connectdata *conn,
   conn->bits.ipv6 = (addr.family == AF_INET6)?TRUE:FALSE;
 #endif
 
-  *sockp = sockfd;
-
   if(-1 == rc) {
-    switch (error) {
+    switch(error) {
     case EINPROGRESS:
     case EWOULDBLOCK:
 #if defined(EAGAIN)
@@ -1042,7 +1041,8 @@ singleipconnect(struct connectdata *conn,
     case EAGAIN:
 #endif
 #endif
-      return CURLE_OK;
+      res = CURLE_OK;
+      break;
 
     default:
       /* unknown error, fallthrough and try another address! */
@@ -1051,11 +1051,15 @@ singleipconnect(struct connectdata *conn,
       data->state.os_errno = error;
 
       /* connect failed */
-      return CURLE_COULDNT_CONNECT;
+      Curl_closesocket(conn, sockfd);
+      res = CURLE_COULDNT_CONNECT;
     }
   }
 
-  return CURLE_OK;
+  if(!res)
+    *sockp = sockfd;
+
+  return res;
 }
 
 /*