connect: Close temporary sockets in conn_free()
authorBjörn Stenberg <bjst@bjorn>
Thu, 7 Nov 2013 23:09:20 +0000 (00:09 +0100)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 10 Nov 2013 22:49:56 +0000 (22:49 +0000)
The temporary sockets used for Happy Eyeballs were not closed properly,
if curl exited prematurely, which this patch fixes.

lib/connect.c
lib/ftp.c
lib/url.c

index 2fd9883b98fcb01c2b09d3b6cb74836e7faa96fd..67f73343c57a9fb18aec0b54554444a586722991 100644 (file)
@@ -758,10 +758,13 @@ CURLcode Curl_is_connected(struct connectdata *conn,
         /* use this socket from now on */
         conn->sock[sockindex] = conn->tempsock[i];
         conn->ip_addr = conn->tempaddr[i];
+        conn->tempsock[i] = CURL_SOCKET_BAD;
 
         /* close the other socket, if open */
-        if(conn->tempsock[other] != CURL_SOCKET_BAD)
+        if(conn->tempsock[other] != CURL_SOCKET_BAD) {
           Curl_closesocket(conn, conn->tempsock[other]);
+          conn->tempsock[other] = CURL_SOCKET_BAD;
+        }
 
         /* see if we need to do any proxy magic first once we connected */
         code = Curl_connected_proxy(conn, sockindex);
index 8879ff1d9f41f73370c8919a6b587cdca338fb77..abd70e070e8542192d45fa168689d9974f7d4a5e 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1866,7 +1866,6 @@ static CURLcode proxy_magic(struct connectdata *conn,
     if(conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE) {
       /* the CONNECT procedure is not complete, the tunnel is not yet up */
       state(conn, FTP_STOP); /* this phase is completed */
-      conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE;
       return result;
     }
     else
index 35b8a6c6e404d14b9c9f1da3837921b1a393dbef..36bd46455fed568dc8bf0296a8e01bfa149adc47 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -2503,6 +2503,10 @@ static void conn_free(struct connectdata *conn)
     Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]);
   if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET])
     Curl_closesocket(conn, conn->sock[FIRSTSOCKET]);
+  if(CURL_SOCKET_BAD != conn->tempsock[0])
+    Curl_closesocket(conn, conn->tempsock[0]);
+  if(CURL_SOCKET_BAD != conn->tempsock[1])
+    Curl_closesocket(conn, conn->tempsock[1]);
 
 #if defined(USE_NTLM) && defined(NTLM_WB_ENABLED)
   Curl_ntlm_wb_cleanup(conn);
@@ -3522,6 +3526,8 @@ static struct connectdata *allocate_conn(struct SessionHandle *data)
 
   conn->sock[FIRSTSOCKET] = CURL_SOCKET_BAD;     /* no file descriptor */
   conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */
+  conn->tempsock[0] = CURL_SOCKET_BAD; /* no file descriptor */
+  conn->tempsock[1] = CURL_SOCKET_BAD; /* no file descriptor */
   conn->connection_id = -1;    /* no ID */
   conn->port = -1; /* unknown at this point */