Skip to content

Commit 00bd55d

Browse files
mscdexgntem
authored andcommitted
dns: fix unsigned record values
Fixes: nodejs#28790 PR-URL: nodejs#28792 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Ben Noordhuis <[email protected]>
1 parent bfd5d37 commit 00bd55d

File tree

2 files changed

+123
-8
lines changed

2 files changed

+123
-8
lines changed

src/cares_wrap.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ Local<Array> AddrTTLToArray(Environment* env,
756756

757757
Local<Array> ttls = Array::New(isolate, naddrttls);
758758
for (size_t i = 0; i < naddrttls; i++) {
759-
auto value = Integer::New(isolate, addrttls[i].ttl);
759+
auto value = Integer::NewFromUnsigned(isolate, addrttls[i].ttl);
760760
ttls->Set(context, i, value).Check();
761761
}
762762

@@ -1139,7 +1139,7 @@ int ParseSoaReply(Environment* env,
11391139
hostmaster.get())).Check();
11401140
soa_record->Set(context,
11411141
env->serial_string(),
1142-
Integer::New(env->isolate(), serial)).Check();
1142+
Integer::NewFromUnsigned(env->isolate(), serial)).Check();
11431143
soa_record->Set(context,
11441144
env->refresh_string(),
11451145
Integer::New(env->isolate(), refresh)).Check();
@@ -1151,7 +1151,7 @@ int ParseSoaReply(Environment* env,
11511151
Integer::New(env->isolate(), expire)).Check();
11521152
soa_record->Set(context,
11531153
env->minttl_string(),
1154-
Integer::New(env->isolate(), minttl)).Check();
1154+
Integer::NewFromUnsigned(env->isolate(), minttl)).Check();
11551155
soa_record->Set(context,
11561156
env->type_string(),
11571157
env->dns_soa_string()).Check();
@@ -1219,7 +1219,8 @@ class QueryAnyWrap: public QueryWrap {
12191219
ret->Get(context, i).ToLocalChecked()).Check();
12201220
obj->Set(context,
12211221
env()->ttl_string(),
1222-
Integer::New(env()->isolate(), addrttls[i].ttl)).Check();
1222+
Integer::NewFromUnsigned(
1223+
env()->isolate(), addrttls[i].ttl)).Check();
12231224
obj->Set(context,
12241225
env()->type_string(),
12251226
env()->dns_a_string()).Check();
@@ -1265,8 +1266,8 @@ class QueryAnyWrap: public QueryWrap {
12651266
ret->Get(context, i).ToLocalChecked()).Check();
12661267
obj->Set(context,
12671268
env()->ttl_string(),
1268-
Integer::New(env()->isolate(), addr6ttls[i - a_count].ttl))
1269-
.Check();
1269+
Integer::NewFromUnsigned(
1270+
env()->isolate(), addr6ttls[i - a_count].ttl)).Check();
12701271
obj->Set(context,
12711272
env()->type_string(),
12721273
env()->dns_aaaa_string()).Check();
@@ -1709,7 +1710,8 @@ class QuerySoaWrap: public QueryWrap {
17091710
soa_out->hostmaster)).Check();
17101711
soa_record->Set(context,
17111712
env()->serial_string(),
1712-
Integer::New(env()->isolate(), soa_out->serial)).Check();
1713+
Integer::NewFromUnsigned(
1714+
env()->isolate(), soa_out->serial)).Check();
17131715
soa_record->Set(context,
17141716
env()->refresh_string(),
17151717
Integer::New(env()->isolate(),
@@ -1722,7 +1724,8 @@ class QuerySoaWrap: public QueryWrap {
17221724
Integer::New(env()->isolate(), soa_out->expire)).Check();
17231725
soa_record->Set(context,
17241726
env()->minttl_string(),
1725-
Integer::New(env()->isolate(), soa_out->minttl)).Check();
1727+
Integer::NewFromUnsigned(
1728+
env()->isolate(), soa_out->minttl)).Check();
17261729

17271730
ares_free_data(soa_out);
17281731

test/parallel/test-dns.js

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121

2222
'use strict';
2323
const common = require('../common');
24+
const dnstools = require('../common/dns');
2425
const assert = require('assert');
2526

2627
const dns = require('dns');
2728
const dnsPromises = dns.promises;
29+
const dgram = require('dgram');
2830

2931
const existing = dns.getServers();
3032
assert(existing.length > 0);
@@ -325,3 +327,113 @@ common.expectsError(() => {
325327
assert.deepStrictEqual(err.message, 'queryMx ENOTFOUND foo.onion');
326328
});
327329
}
330+
331+
{
332+
const cases = [
333+
{ method: 'resolveAny',
334+
answers: [
335+
{ type: 'A', address: '1.2.3.4', ttl: 3333333333 },
336+
{ type: 'AAAA', address: '::42', ttl: 3333333333 },
337+
{ type: 'MX', priority: 42, exchange: 'foobar.com', ttl: 3333333333 },
338+
{ type: 'NS', value: 'foobar.org', ttl: 3333333333 },
339+
{ type: 'PTR', value: 'baz.org', ttl: 3333333333 },
340+
{
341+
type: 'SOA',
342+
nsname: 'ns1.example.com',
343+
hostmaster: 'admin.example.com',
344+
serial: 3210987654,
345+
refresh: 900,
346+
retry: 900,
347+
expire: 1800,
348+
minttl: 3333333333
349+
},
350+
]
351+
},
352+
353+
{ method: 'resolve4',
354+
options: { ttl: true },
355+
answers: [ { type: 'A', address: '1.2.3.4', ttl: 3333333333 } ]
356+
},
357+
358+
{ method: 'resolve6',
359+
options: { ttl: true },
360+
answers: [ { type: 'AAAA', address: '::42', ttl: 3333333333 } ]
361+
},
362+
363+
{ method: 'resolveSoa',
364+
answers: [
365+
{
366+
type: 'SOA',
367+
nsname: 'ns1.example.com',
368+
hostmaster: 'admin.example.com',
369+
serial: 3210987654,
370+
refresh: 900,
371+
retry: 900,
372+
expire: 1800,
373+
minttl: 3333333333
374+
}
375+
]
376+
},
377+
];
378+
379+
const server = dgram.createSocket('udp4');
380+
381+
server.on('message', common.mustCall((msg, { address, port }) => {
382+
const parsed = dnstools.parseDNSPacket(msg);
383+
const domain = parsed.questions[0].domain;
384+
assert.strictEqual(domain, 'example.org');
385+
386+
server.send(dnstools.writeDNSPacket({
387+
id: parsed.id,
388+
questions: parsed.questions,
389+
answers: cases[0].answers.map(
390+
(answer) => Object.assign({ domain }, answer)
391+
),
392+
}), port, address);
393+
}, cases.length * 2));
394+
395+
server.bind(0, common.mustCall(() => {
396+
const address = server.address();
397+
dns.setServers([`127.0.0.1:${address.port}`]);
398+
399+
function validateResults(res) {
400+
if (!Array.isArray(res))
401+
res = [res];
402+
403+
assert.deepStrictEqual(res.map(tweakEntry),
404+
cases[0].answers.map(tweakEntry));
405+
}
406+
407+
function tweakEntry(r) {
408+
const ret = { ...r };
409+
410+
const { method } = cases[0];
411+
412+
// TTL values are only provided for A and AAAA entries.
413+
if (!['A', 'AAAA'].includes(ret.type) && !/^resolve(4|6)?$/.test(method))
414+
delete ret.ttl;
415+
416+
if (method !== 'resolveAny')
417+
delete ret.type;
418+
419+
return ret;
420+
}
421+
422+
(async function nextCase() {
423+
if (cases.length === 0)
424+
return server.close();
425+
426+
const { method, options } = cases[0];
427+
428+
validateResults(await dnsPromises[method]('example.org', options));
429+
430+
dns[method]('example.org', options, common.mustCall((err, res) => {
431+
assert.ifError(err);
432+
validateResults(res);
433+
cases.shift();
434+
nextCase();
435+
}));
436+
})();
437+
438+
}));
439+
}

0 commit comments

Comments
 (0)