Commit e7d77fb3 authored by Björn Stenberg's avatar Björn Stenberg Committed by Steve Holme
Browse files

connect: Close temporary sockets in conn_free()

The temporary sockets used for Happy Eyeballs were not closed properly,
if curl exited prematurely, which this patch fixes.
parent c8e63f24
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -758,10 +758,13 @@ CURLcode Curl_is_connected(struct connectdata *conn,
        /* use this socket from now on */
        /* use this socket from now on */
        conn->sock[sockindex] = conn->tempsock[i];
        conn->sock[sockindex] = conn->tempsock[i];
        conn->ip_addr = conn->tempaddr[i];
        conn->ip_addr = conn->tempaddr[i];
        conn->tempsock[i] = CURL_SOCKET_BAD;


        /* close the other socket, if open */
        /* 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]);
          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 */
        /* see if we need to do any proxy magic first once we connected */
        code = Curl_connected_proxy(conn, sockindex);
        code = Curl_connected_proxy(conn, sockindex);
+0 −1
Original line number Original line Diff line number Diff line
@@ -1866,7 +1866,6 @@ static CURLcode proxy_magic(struct connectdata *conn,
    if(conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE) {
    if(conn->tunnel_state[SECONDARYSOCKET] != TUNNEL_COMPLETE) {
      /* the CONNECT procedure is not complete, the tunnel is not yet up */
      /* the CONNECT procedure is not complete, the tunnel is not yet up */
      state(conn, FTP_STOP); /* this phase is completed */
      state(conn, FTP_STOP); /* this phase is completed */
      conn->bits.tcpconnect[SECONDARYSOCKET] = FALSE;
      return result;
      return result;
    }
    }
    else
    else
+6 −0
Original line number Original line Diff line number Diff line
@@ -2503,6 +2503,10 @@ static void conn_free(struct connectdata *conn)
    Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]);
    Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]);
  if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET])
  if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET])
    Curl_closesocket(conn, 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)
#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED)
  Curl_ntlm_wb_cleanup(conn);
  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[FIRSTSOCKET] = CURL_SOCKET_BAD;     /* no file descriptor */
  conn->sock[SECONDARYSOCKET] = 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->connection_id = -1;    /* no ID */
  conn->port = -1; /* unknown at this point */
  conn->port = -1; /* unknown at this point */