mirror of
https://github.com/curl/curl.git
synced 2026-07-31 21:18:04 +03:00
cfilter: provide call to tell connection to forget a socket
- fixed libssh.c workaround for a socket being closed by the library - eliminate the terrible hack in cf-socket.c to guess when this happened and try not closing the socket again. - fixes race in eyeballing when socket could have failed to be closed for a discarded connect attempt Closes #12207
This commit is contained in:
parent
39547ae64d
commit
37b5cf4fa0
4 changed files with 31 additions and 31 deletions
|
|
@ -880,34 +880,14 @@ static void cf_socket_close(struct Curl_cfilter *cf, struct Curl_easy *data)
|
|||
struct cf_socket_ctx *ctx = cf->ctx;
|
||||
|
||||
if(ctx && CURL_SOCKET_BAD != ctx->sock) {
|
||||
if(ctx->active) {
|
||||
/* We share our socket at cf->conn->sock[cf->sockindex] when active.
|
||||
* If it is no longer there, someone has stolen (and hopefully
|
||||
* closed it) and we just forget about it.
|
||||
*/
|
||||
if(ctx->sock == cf->conn->sock[cf->sockindex]) {
|
||||
CURL_TRC_CF(data, cf, "cf_socket_close(%" CURL_FORMAT_SOCKET_T
|
||||
", active)", ctx->sock);
|
||||
socket_close(data, cf->conn, !ctx->accepted, ctx->sock);
|
||||
cf->conn->sock[cf->sockindex] = CURL_SOCKET_BAD;
|
||||
}
|
||||
else {
|
||||
CURL_TRC_CF(data, cf, "cf_socket_close(%" CURL_FORMAT_SOCKET_T
|
||||
") no longer at conn->sock[], discarding", ctx->sock);
|
||||
/* TODO: we do not want this to happen. Need to check which
|
||||
* code is messing with conn->sock[cf->sockindex] */
|
||||
}
|
||||
ctx->sock = CURL_SOCKET_BAD;
|
||||
if(cf->sockindex == FIRSTSOCKET)
|
||||
cf->conn->remote_addr = NULL;
|
||||
}
|
||||
else {
|
||||
/* this is our local socket, we did never publish it */
|
||||
CURL_TRC_CF(data, cf, "cf_socket_close(%" CURL_FORMAT_SOCKET_T
|
||||
", not active)", ctx->sock);
|
||||
socket_close(data, cf->conn, !ctx->accepted, ctx->sock);
|
||||
ctx->sock = CURL_SOCKET_BAD;
|
||||
}
|
||||
CURL_TRC_CF(data, cf, "cf_socket_close(%" CURL_FORMAT_SOCKET_T
|
||||
")", ctx->sock);
|
||||
if(ctx->sock == cf->conn->sock[cf->sockindex])
|
||||
cf->conn->sock[cf->sockindex] = CURL_SOCKET_BAD;
|
||||
socket_close(data, cf->conn, !ctx->accepted, ctx->sock);
|
||||
ctx->sock = CURL_SOCKET_BAD;
|
||||
if(ctx->active && cf->sockindex == FIRSTSOCKET)
|
||||
cf->conn->remote_addr = NULL;
|
||||
Curl_bufq_reset(&ctx->recvbuf);
|
||||
ctx->active = FALSE;
|
||||
ctx->buffer_recv = FALSE;
|
||||
|
|
@ -1514,6 +1494,9 @@ static CURLcode cf_socket_cntrl(struct Curl_cfilter *cf,
|
|||
case CF_CTRL_DATA_SETUP:
|
||||
Curl_persistconninfo(data, cf->conn, ctx->l_ip, ctx->l_port);
|
||||
break;
|
||||
case CF_CTRL_FORGET_SOCKET:
|
||||
ctx->sock = CURL_SOCKET_BAD;
|
||||
break;
|
||||
}
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue