int Curl_closesocket(struct connectdata *conn,
curl_socket_t sock)
{
- if(conn && conn->fclosesocket)
- return conn->fclosesocket(conn->closesocket_client, sock);
- else
- return sclose(sock);
+ if(conn && conn->fclosesocket) {
+ if((sock != conn->sock[SECONDARYSOCKET]) ||
+ !conn->sock_accepted[SECONDARYSOCKET])
+ /* if this socket matches the second socket, and that was created with
+ accept, then we MUST NOT call the callback */
+ return conn->fclosesocket(conn->closesocket_client, sock);
+ }
+ return sclose(sock);
}
/*
conn->sock[SECONDARYSOCKET] = s;
curlx_nonblock(s, TRUE); /* enable non-blocking */
+ conn->sock_accepted[SECONDARYSOCKET] = TRUE;
return CURLE_OK;
} /* switch() */
}
struct timeval created; /* creation time */
curl_socket_t sock[2]; /* two sockets, the second is used for the data
transfer when doing FTP */
-
+ bool sock_accepted[2]; /* TRUE if the socket on this index was created with
+ accept() */
Curl_recv *recv[2];
Curl_send *send[2];