Skip to content

Commit 4e1c4e8

Browse files
Masashi Hiranotrivikr
Masashi Hirano
authored andcommitted
dns: type check for dns.setServers argument.
Added type check for argument for dns.setServers and dnsPromises.setServers. PR-URL: #21944 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jon Moss <me@jonathanmoss.me> Reviewed-By: Yuta Hiroto <hello@hiroppy.me> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Сковорода Никита Андреевич <chalkerx@gmail.com>
1 parent fdbc668 commit 4e1c4e8

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

lib/internal/dns/utils.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const IPv6RE = /^\[([^[\]]*)\]/;
1212
const addrSplitRE = /(^.+?)(?::(\d+))?$/;
1313
const {
1414
ERR_DNS_SET_SERVERS_FAILED,
15+
ERR_INVALID_ARG_TYPE,
1516
ERR_INVALID_IP_ADDRESS,
1617
ERR_INVALID_OPT_VALUE
1718
} = errors.codes;
@@ -37,13 +38,20 @@ class Resolver {
3738
}
3839

3940
setServers(servers) {
41+
if (!Array.isArray(servers)) {
42+
throw new ERR_INVALID_ARG_TYPE('servers', 'Array', servers);
43+
}
44+
4045
// Cache the original servers because in the event of an error while
4146
// setting the servers, c-ares won't have any servers available for
4247
// resolution.
4348
const orig = this._handle.getServers();
4449
const newSet = [];
4550

46-
servers.forEach((serv) => {
51+
servers.forEach((serv, index) => {
52+
if (typeof serv !== 'string') {
53+
throw new ERR_INVALID_ARG_TYPE(`servers[${index}]`, 'string', serv);
54+
}
4755
var ipVersion = isIP(serv);
4856

4957
if (ipVersion !== 0)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
'use strict';
2+
require('../common');
3+
const { addresses } = require('../common/internet');
4+
const assert = require('assert');
5+
const dns = require('dns');
6+
const resolver = new dns.promises.Resolver();
7+
const dnsPromises = dns.promises;
8+
const promiseResolver = new dns.promises.Resolver();
9+
10+
{
11+
[
12+
null,
13+
undefined,
14+
Number(addresses.DNS4_SERVER),
15+
addresses.DNS4_SERVER,
16+
{
17+
address: addresses.DNS4_SERVER
18+
}
19+
].forEach((val) => {
20+
const errObj = {
21+
code: 'ERR_INVALID_ARG_TYPE',
22+
name: 'TypeError [ERR_INVALID_ARG_TYPE]',
23+
message: 'The "servers" argument must be of type Array. Received type ' +
24+
typeof val
25+
};
26+
assert.throws(
27+
() => {
28+
dns.setServers(val);
29+
}, errObj
30+
);
31+
assert.throws(
32+
() => {
33+
resolver.setServers(val);
34+
}, errObj
35+
);
36+
assert.throws(
37+
() => {
38+
dnsPromises.setServers(val);
39+
}, errObj
40+
);
41+
assert.throws(
42+
() => {
43+
promiseResolver.setServers(val);
44+
}, errObj
45+
);
46+
});
47+
}
48+
49+
{
50+
[
51+
[null],
52+
[undefined],
53+
[Number(addresses.DNS4_SERVER)],
54+
[
55+
{
56+
address: addresses.DNS4_SERVER
57+
}
58+
]
59+
].forEach((val) => {
60+
const errObj = {
61+
code: 'ERR_INVALID_ARG_TYPE',
62+
name: 'TypeError [ERR_INVALID_ARG_TYPE]',
63+
message: 'The "servers[0]" argument must be of type string. ' +
64+
`Received type ${typeof val[0]}`
65+
};
66+
assert.throws(
67+
() => {
68+
dns.setServers(val);
69+
}, errObj
70+
);
71+
assert.throws(
72+
() => {
73+
resolver.setServers(val);
74+
}, errObj
75+
);
76+
assert.throws(
77+
() => {
78+
dnsPromises.setServers(val);
79+
}, errObj
80+
);
81+
assert.throws(
82+
() => {
83+
promiseResolver.setServers(val);
84+
}, errObj
85+
);
86+
});
87+
}

0 commit comments

Comments
 (0)