From b0bee93dfee587530b1eac1060e12c7336aa4c88 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Thu, 19 Oct 2023 09:24:27 +0200 Subject: [PATCH] url: don't touch the multi handle when closing internal handles Reported-by: Maksymilian Arciemowicz Closes #12165 --- lib/doh.c | 4 +++- lib/url.c | 20 +++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/doh.c b/lib/doh.c index 9f86631543..9be32d3bc5 100644 --- a/lib/doh.c +++ b/lib/doh.c @@ -373,7 +373,7 @@ struct Curl_addrinfo *Curl_doh(struct Curl_easy *data, int slot; struct dohdata *dohp; struct connectdata *conn = data->conn; - *waitp = TRUE; /* this never returns synchronously */ + *waitp = FALSE; (void)hostname; (void)port; @@ -413,12 +413,14 @@ struct Curl_addrinfo *Curl_doh(struct Curl_easy *data, dohp->pending++; } #endif + *waitp = TRUE; /* this never returns synchronously */ return NULL; error: curl_slist_free_all(dohp->headers); data->req.doh->headers = NULL; for(slot = 0; slot < DOH_PROBE_SLOTS; slot++) { + (void)curl_multi_remove_handle(data->multi, dohp->probe[slot].easy); Curl_close(&dohp->probe[slot].easy); } Curl_safefree(data->req.doh); diff --git a/lib/url.c b/lib/url.c index 61dad442dd..e2d97e21d6 100644 --- a/lib/url.c +++ b/lib/url.c @@ -363,16 +363,18 @@ CURLcode Curl_close(struct Curl_easy **datap) /* Detach connection if any is left. This should not be normal, but can be the case for example with CONNECT_ONLY + recv/send (test 556) */ Curl_detach_connection(data); - if(data->multi) - /* This handle is still part of a multi handle, take care of this first - and detach this handle from there. */ - curl_multi_remove_handle(data->multi, data); + if(!data->internal) { + if(data->multi) + /* This handle is still part of a multi handle, take care of this first + and detach this handle from there. */ + curl_multi_remove_handle(data->multi, data); - if(data->multi_easy) { - /* when curl_easy_perform() is used, it creates its own multi handle to - use and this is the one */ - curl_multi_cleanup(data->multi_easy); - data->multi_easy = NULL; + if(data->multi_easy) { + /* when curl_easy_perform() is used, it creates its own multi handle to + use and this is the one */ + curl_multi_cleanup(data->multi_easy); + data->multi_easy = NULL; + } } data->magic = 0; /* force a clear AFTER the possibly enforced removal from