From 087a74e0731175d80de261f2688057fb8e0ec92e Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 8 Jul 2026 12:55:39 +0200 Subject: [PATCH] dns: stop using deprecated functions in `SetServers` Signed-off-by: Antoine du Hamel --- src/cares_wrap.cc | 42 ++++++++++++--------------------------- test/parallel/test-dns.js | 7 +++++-- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 72f3d06fe07569..0f672897cd2b43 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -2110,15 +2110,9 @@ void SetServers(const FunctionCallbackInfo& args) { uint32_t len = arr->Length(); - if (len == 0) { - int rv = ares_set_servers(channel->cares_channel(), nullptr); - return args.GetReturnValue().Set(rv); - } - - std::vector servers(len); - ares_addr_port_node* last = nullptr; - - int err; + // An empty list clears all configured servers. ares_set_servers_ports_csv() + // treats an empty string as "blank all servers". + std::string csv; for (uint32_t i = 0; i < len; i++) { Local val; @@ -2143,37 +2137,27 @@ void SetServers(const FunctionCallbackInfo& args) { node::Utf8Value ip(env->isolate(), ipValue); int port = portValue->Int32Value(env->context()).FromJust(); - ares_addr_port_node* cur = &servers[i]; + if (!csv.empty()) csv += ','; - cur->tcp_port = cur->udp_port = port; + // Incoming CSV format expected by c-ares: host[:port][,host[:port]]... + // IPv6 addresses must be wrapped in square brackets. switch (fam) { case 4: - cur->family = AF_INET; - err = uv_inet_pton(AF_INET, *ip, &cur->addr); + csv += *ip; break; case 6: - cur->family = AF_INET6; - err = uv_inet_pton(AF_INET6, *ip, &cur->addr); + csv += '['; + csv += *ip; + csv += ']'; break; default: UNREACHABLE("Bad address family"); } - - if (err) - break; - - cur->next = nullptr; - - if (last != nullptr) - last->next = cur; - - last = cur; + csv += ':'; + csv += std::to_string(port); } - if (err == 0) - err = ares_set_servers_ports(channel->cares_channel(), servers.data()); - else - err = ARES_EBADSTR; + int err = ares_set_servers_ports_csv(channel->cares_channel(), csv.c_str()); if (err == ARES_SUCCESS) channel->set_is_servers_default(false); diff --git a/test/parallel/test-dns.js b/test/parallel/test-dns.js index d7c2efcbd16ee3..e885a700752e58 100644 --- a/test/parallel/test-dns.js +++ b/test/parallel/test-dns.js @@ -130,12 +130,15 @@ const portsExpected = [ '4.4.4.4', '2001:4860:4860::8888', '103.238.225.181:666', - '[fe80::483a:5aff:fee6:1f04]:666', - 'fe80::483a:5aff:fee6:1f04', ]; dns.setServers(ports); assert.deepStrictEqual(dns.getServers(), portsExpected); +// Link-local IPv6 addresses require a zone index (scope id) to be usable; +// c-ares drops link-local servers configured without one. +dns.setServers(['[fe80::483a:5aff:fee6:1f04]%eth0']); +assert.deepStrictEqual(dns.getServers(), []); + dns.setServers([]); assert.deepStrictEqual(dns.getServers(), []);