Skip to content

Commit

Permalink
multi: have curl_multi_remove_handle close CONNECT_ONLY transfer
Browse files Browse the repository at this point in the history
Ẃhen it has been used in the multi interface, it is otherwise left in
the connection cache, can't be reused and nothing will close them since
the easy handle loses the association with the multi handle and thus the
connection cache - until the multi handle is closed or it gets pruned
because the cache is full.

Reported-by: Dominik Thalhammer
Fixes #9335
Closes #9342
  • Loading branch information
bagder committed Aug 23, 2022
1 parent fdbcd39 commit 31a41d4
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions lib/multi.c
Expand Up @@ -828,6 +828,24 @@ CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
/* Remove the association between the connection and the handle */
Curl_detach_connection(data);

if(data->set.connect_only && !data->multi_easy) {
/* This removes a handle that was part the multi inteface that used
CONNECT_ONLY, that connection is now left alive but since this handle
has bits.close set nothing can use that transfer anymore and it is
forbidden from reuse. And this easy handle cannot find the connection
anymore once removed from the multi handle
Better close the connection here, at once.
*/
struct connectdata *c;
curl_socket_t s;
s = Curl_getconnectinfo(data, &c);
if((s != CURL_SOCKET_BAD) && c) {
Curl_conncache_remove_conn(data, c, TRUE);
Curl_disconnect(data, c, TRUE);
}
}

if(data->state.lastconnect_id != -1) {
/* Mark any connect-only connection for closure */
Curl_conncache_foreach(data, data->state.conn_cache,
Expand Down

0 comments on commit 31a41d4

Please sign in to comment.