Skip to content

Commit efc0a14

Browse files
authored
dns: stop using deprecated functions in SetServers
Signed-off-by: Antoine du Hamel <duhamelantoine1995@gmail.com> PR-URL: #64356 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
1 parent 3a2be84 commit efc0a14

2 files changed

Lines changed: 18 additions & 31 deletions

File tree

src/cares_wrap.cc

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2230,15 +2230,9 @@ void SetServers(const FunctionCallbackInfo<Value>& args) {
22302230

22312231
uint32_t len = arr->Length();
22322232

2233-
if (len == 0) {
2234-
int rv = ares_set_servers(channel->cares_channel(), nullptr);
2235-
return args.GetReturnValue().Set(rv);
2236-
}
2237-
2238-
std::vector<ares_addr_port_node> servers(len);
2239-
ares_addr_port_node* last = nullptr;
2240-
2241-
int err;
2233+
// An empty list clears all configured servers. ares_set_servers_ports_csv()
2234+
// treats an empty string as "blank all servers".
2235+
std::string csv;
22422236

22432237
for (uint32_t i = 0; i < len; i++) {
22442238
Local<Value> val;
@@ -2263,37 +2257,27 @@ void SetServers(const FunctionCallbackInfo<Value>& args) {
22632257
node::Utf8Value ip(env->isolate(), ipValue);
22642258
int port = portValue->Int32Value(env->context()).FromJust();
22652259

2266-
ares_addr_port_node* cur = &servers[i];
2260+
if (!csv.empty()) csv += ',';
22672261

2268-
cur->tcp_port = cur->udp_port = port;
2262+
// Incoming CSV format expected by c-ares: host[:port][,host[:port]]...
2263+
// IPv6 addresses must be wrapped in square brackets.
22692264
switch (fam) {
22702265
case 4:
2271-
cur->family = AF_INET;
2272-
err = uv_inet_pton(AF_INET, *ip, &cur->addr);
2266+
csv += *ip;
22732267
break;
22742268
case 6:
2275-
cur->family = AF_INET6;
2276-
err = uv_inet_pton(AF_INET6, *ip, &cur->addr);
2269+
csv += '[';
2270+
csv += *ip;
2271+
csv += ']';
22772272
break;
22782273
default:
22792274
UNREACHABLE("Bad address family");
22802275
}
2281-
2282-
if (err)
2283-
break;
2284-
2285-
cur->next = nullptr;
2286-
2287-
if (last != nullptr)
2288-
last->next = cur;
2289-
2290-
last = cur;
2276+
csv += ':';
2277+
csv += std::to_string(port);
22912278
}
22922279

2293-
if (err == 0)
2294-
err = ares_set_servers_ports(channel->cares_channel(), servers.data());
2295-
else
2296-
err = ARES_EBADSTR;
2280+
int err = ares_set_servers_ports_csv(channel->cares_channel(), csv.c_str());
22972281

22982282
if (err == ARES_SUCCESS)
22992283
channel->set_is_servers_default(false);

test/parallel/test-dns.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,15 @@ const portsExpected = [
130130
'4.4.4.4',
131131
'2001:4860:4860::8888',
132132
'103.238.225.181:666',
133-
'[fe80::483a:5aff:fee6:1f04]:666',
134-
'fe80::483a:5aff:fee6:1f04',
135133
];
136134
dns.setServers(ports);
137135
assert.deepStrictEqual(dns.getServers(), portsExpected);
138136

137+
// Link-local IPv6 addresses require a zone index (scope id) to be usable;
138+
// c-ares drops link-local servers configured without one.
139+
dns.setServers(['[fe80::483a:5aff:fee6:1f04]%eth0']);
140+
assert.deepStrictEqual(dns.getServers(), []);
141+
139142
dns.setServers([]);
140143
assert.deepStrictEqual(dns.getServers(), []);
141144

0 commit comments

Comments
 (0)