From 09060045b1ac892ebf7abd5ddf98ba13655e02da Mon Sep 17 00:00:00 2001 From: Aviv Keller Date: Wed, 30 Oct 2024 10:10:28 -0400 Subject: [PATCH] dns: stop using deprecated `ares_query` PR-URL: https://github.com/nodejs/node/pull/55430 Refs: https://github.com/nodejs/node/issues/52464 Reviewed-By: Luigi Pinca Reviewed-By: Matteo Collina --- src/cares_wrap.cc | 24 ++++++++++++------------ src/cares_wrap.h | 35 +++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index ac79eeaaf7b150..84d2ab2b065e5d 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -830,62 +830,62 @@ void ChannelWrap::EnsureServers() { } int AnyTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_any); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_ANY); return ARES_SUCCESS; } int ATraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_a); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_A); return ARES_SUCCESS; } int AaaaTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_aaaa); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_AAAA); return ARES_SUCCESS; } int CaaTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, T_CAA); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_CAA); return ARES_SUCCESS; } int CnameTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_cname); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_CNAME); return ARES_SUCCESS; } int MxTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_mx); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_MX); return ARES_SUCCESS; } int NsTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_ns); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_NS); return ARES_SUCCESS; } int TxtTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_txt); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_TXT); return ARES_SUCCESS; } int SrvTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_srv); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_SRV); return ARES_SUCCESS; } int PtrTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_ptr); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_PTR); return ARES_SUCCESS; } int NaptrTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_naptr); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_NAPTR); return ARES_SUCCESS; } int SoaTraits::Send(QueryWrap* wrap, const char* name) { - wrap->AresQuery(name, ns_c_in, ns_t_soa); + wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_SOA); return ARES_SUCCESS; } diff --git a/src/cares_wrap.h b/src/cares_wrap.h index 021ef1c9de518e..4a5d22c0ef085f 100644 --- a/src/cares_wrap.h +++ b/src/cares_wrap.h @@ -246,18 +246,20 @@ class QueryWrap final : public AsyncWrap { return Traits::Send(this, name); } - void AresQuery(const char* name, int dnsclass, int type) { + void AresQuery(const char* name, + ares_dns_class_t dnsclass, + ares_dns_rec_type_t type) { channel_->EnsureServers(); TRACE_EVENT_NESTABLE_ASYNC_BEGIN1( TRACING_CATEGORY_NODE2(dns, native), trace_name_, this, "name", TRACE_STR_COPY(name)); - ares_query( - channel_->cares_channel(), - name, - dnsclass, - type, - Callback, - MakeCallbackPointer()); + ares_query_dnsrec(channel_->cares_channel(), + name, + dnsclass, + type, + Callback, + MakeCallbackPointer(), + nullptr); } void ParseError(int status) { @@ -304,19 +306,20 @@ class QueryWrap final : public AsyncWrap { return wrap; } - static void Callback( - void* arg, - int status, - int timeouts, - unsigned char* answer_buf, - int answer_len) { + static void Callback(void* arg, + ares_status_t status, + size_t timeouts, + const ares_dns_record_t* dnsrec) { QueryWrap* wrap = FromCallbackPointer(arg); if (wrap == nullptr) return; unsigned char* buf_copy = nullptr; + size_t answer_len = 0; if (status == ARES_SUCCESS) { - buf_copy = node::Malloc(answer_len); - memcpy(buf_copy, answer_buf, answer_len); + // No need to explicitly call ares_free_string here, + // as it is a wrapper around free, which is already + // invoked when MallocedBuffer is destructed. + ares_dns_write(dnsrec, &buf_copy, &answer_len); } wrap->response_data_ = std::make_unique();