From faa2db202b9b90a157f1204d1e028b377042841b Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Tue, 19 Aug 2025 15:46:34 +0200 Subject: [PATCH] ares: handle channel being destroyed early We are destroying the ares channel already when we shutdown resolving. Querying the pollset afterwards is still happening, especially in event based processing and needs to work in the absence of a channel. Fixes #18317 Reported-by: Natris on github Closes #18318 --- lib/asyn-ares.c | 5 +++-- lib/asyn-base.c | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/asyn-ares.c b/lib/asyn-ares.c index bb3f4af0b9..3eb769d934 100644 --- a/lib/asyn-ares.c +++ b/lib/asyn-ares.c @@ -280,8 +280,9 @@ void Curl_async_ares_destroy(struct Curl_easy *data) CURLcode Curl_async_pollset(struct Curl_easy *data, struct easy_pollset *ps) { struct async_ares_ctx *ares = &data->state.async.ares; - DEBUGASSERT(ares->channel); - return Curl_ares_pollset(data, ares->channel, ps); + if(ares->channel) + return Curl_ares_pollset(data, ares->channel, ps); + return CURLE_OK; } /* diff --git a/lib/asyn-base.c b/lib/asyn-base.c index c0df7aac5e..eb2240b816 100644 --- a/lib/asyn-base.c +++ b/lib/asyn-base.c @@ -91,6 +91,10 @@ CURLcode Curl_ares_pollset(struct Curl_easy *data, timediff_t milli; CURLcode result = CURLE_OK; + DEBUGASSERT(channel); + if(!channel) + return CURLE_FAILED_INIT; + bitmap = ares_getsock(channel, (ares_socket_t *)sockets, CURL_ARRAYSIZE(sockets)); for(i = 0; i < CURL_ARRAYSIZE(sockets); ++i) { @@ -107,6 +111,8 @@ CURLcode Curl_ares_pollset(struct Curl_easy *data, } timeout = ares_timeout(channel, &maxtime, &timebuf); + if(!timeout) + timeout = &maxtime; milli = curlx_tvtoms(timeout); Curl_expire(data, milli, EXPIRE_ASYNC_NAME); return result; -- 2.47.3