From: Stefan Eissing Date: Tue, 19 Aug 2025 13:46:34 +0000 (+0200) Subject: ares: handle channel being destroyed early X-Git-Tag: curl-8_16_0~152 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=faa2db202b9b90a157f1204d1e028b377042841b;p=thirdparty%2Fcurl.git 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 --- 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;