From 0bf85b4a2998d354dfb8d61e973f54a810c31ad6 Mon Sep 17 00:00:00 2001 From: Archkon <180910180+Archkon@users.noreply.github.com> Date: Fri, 3 Jul 2026 15:24:48 +0800 Subject: [PATCH] dns: do not consult hosts file in reverse lookups Signed-off-by: Archkon <180910180+Archkon@users.noreply.github.com> --- src/cares_wrap.cc | 4 ++- test/parallel/test-c-ares.js | 14 -------- test/parallel/test-dns-reverse-dns-only.js | 37 ++++++++++++++++++++++ 3 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 test/parallel/test-dns-reverse-dns-only.js diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 72f3d06fe07569..952328edb4287d 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -895,6 +895,8 @@ void ChannelWrap::Setup() { options.timeout = timeout_; options.tries = tries_; options.qcache_max_ttl = 0; + // Resolver APIs always perform DNS queries and must not consult hosts files. + options.lookups = const_cast("b"); int r; if (!library_inited_) { @@ -908,7 +910,7 @@ void ChannelWrap::Setup() { /* We do the call to ares_init_option for caller. */ int optmask = ARES_OPT_FLAGS | ARES_OPT_TIMEOUTMS | ARES_OPT_SOCK_STATE_CB | - ARES_OPT_TRIES | ARES_OPT_QUERY_CACHE; + ARES_OPT_TRIES | ARES_OPT_QUERY_CACHE | ARES_OPT_LOOKUPS; if (max_timeout_ > 0) { options.maxtimeout = max_timeout_; diff --git a/test/parallel/test-c-ares.js b/test/parallel/test-c-ares.js index 08d77ed65731ba..9c59b29501c669 100644 --- a/test/parallel/test-c-ares.js +++ b/test/parallel/test-c-ares.js @@ -76,17 +76,3 @@ dns.lookup('::1', common.mustSucceed((result, addressType) => { assert.throws(() => dnsPromises.resolve('www.google.com', val), err); }); - -// Windows doesn't usually have an entry for localhost 127.0.0.1 in -// C:\Windows\System32\drivers\etc\hosts -// so we disable this test on Windows. -// IBMi reports `ENOTFOUND` when get hostname by address 127.0.0.1 -if (!common.isWindows && !common.isIBMi) { - dns.reverse('127.0.0.1', common.mustSucceed((domains) => { - assert.ok(Array.isArray(domains)); - })); - - (async function() { - assert.ok(Array.isArray(await dnsPromises.reverse('127.0.0.1'))); - })().then(common.mustCall()); -} diff --git a/test/parallel/test-dns-reverse-dns-only.js b/test/parallel/test-dns-reverse-dns-only.js new file mode 100644 index 00000000000000..c1c72caf676e23 --- /dev/null +++ b/test/parallel/test-dns-reverse-dns-only.js @@ -0,0 +1,37 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const dgram = require('dgram'); +const dns = require('dns'); +const dnstools = require('../common/dns'); + +const server = dgram.createSocket('udp4'); +const resolver = new dns.Resolver(); +const expectedHostname = 'reverse-dns-only.example'; + +server.on('message', common.mustCall((msg, { address, port }) => { + const parsed = dnstools.parseDNSPacket(msg); + const question = parsed.questions[0]; + + assert.strictEqual(question.domain, '1.0.0.127.in-addr.arpa'); + assert.strictEqual(question.type, 'PTR'); + + server.send(dnstools.writeDNSPacket({ + id: parsed.id, + questions: parsed.questions, + answers: [{ + type: 'PTR', + domain: question.domain, + value: expectedHostname, + }], + }), port, address); +})); + +server.bind(0, common.mustCall(() => { + resolver.setServers([`127.0.0.1:${server.address().port}`]); + resolver.reverse('127.0.0.1', common.mustSucceed((hostnames) => { + assert.deepStrictEqual(hostnames, [expectedHostname]); + server.close(); + })); +}));