asny-thrdd: fix detach from running thread

When cancelling a threaded resolve and the thread is
still running, detach from it under the mutex lock.

Otherwise, the detach might happen after the thread finished
and access already freed memory.

Fixes #17256
Reported-by: Mathieu Garaud
Closes #17320
This commit is contained in:
Stefan Eissing 2025-05-12 10:08:21 +02:00 committed by Daniel Stenberg
parent cf511e7726
commit 2e1040fa5c
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -323,14 +323,14 @@ static void async_thrdd_destroy(struct Curl_easy *data)
CURL_TRC_DNS(data, "resolve, destroy async data, shared ref=%d",
addr->ref_count);
done = !addr->ref_count;
Curl_mutex_release(&addr->mutx);
if(!done) {
/* thread is still running. Detach the thread, it will
/* thread is still running. Detach the thread while mutexed, it will
* trigger the cleanup when it releases its reference. */
Curl_thread_destroy(&addr->thread_hnd);
}
else {
Curl_mutex_release(&addr->mutx);
if(done) {
/* thread has released its reference, join it and
* release the memory we shared with it. */
if(addr->thread_hnd != curl_thread_t_null)