From b19c58d6460a47d10bcdb874f2b72472628d711d Mon Sep 17 00:00:00 2001 From: Masashi Hirano Date: Mon, 23 Jul 2018 18:49:36 +0900 Subject: [PATCH 1/3] dns: type check for dns.setServers argument. Added type check for argument for dns.setServers and dnsPromises.setServers. --- lib/internal/dns/utils.js | 10 ++- .../test-dns-setservers-type-check.js | 88 +++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 test/internet/test-dns-setservers-type-check.js diff --git a/lib/internal/dns/utils.js b/lib/internal/dns/utils.js index 43b65418848f85..f6bace7528fc3a 100644 --- a/lib/internal/dns/utils.js +++ b/lib/internal/dns/utils.js @@ -12,6 +12,7 @@ const IPv6RE = /^\[([^[\]]*)\]/; const addrSplitRE = /(^.+?)(?::(\d+))?$/; const { ERR_DNS_SET_SERVERS_FAILED, + ERR_INVALID_ARG_TYPE, ERR_INVALID_IP_ADDRESS, ERR_INVALID_OPT_VALUE } = errors.codes; @@ -37,13 +38,20 @@ class Resolver { } setServers(servers) { + if (!Array.isArray(servers)) { + throw new ERR_INVALID_ARG_TYPE('servers', 'Array', servers); + } + // Cache the original servers because in the event of an error while // setting the servers, c-ares won't have any servers available for // resolution. const orig = this._handle.getServers(); const newSet = []; - servers.forEach((serv) => { + servers.forEach((serv, index) => { + if (typeof serv !== 'string') { + throw new ERR_INVALID_ARG_TYPE(`servers[${index}]`, 'string', serv); + } var ipVersion = isIP(serv); if (ipVersion !== 0) diff --git a/test/internet/test-dns-setservers-type-check.js b/test/internet/test-dns-setservers-type-check.js new file mode 100644 index 00000000000000..c896f810375444 --- /dev/null +++ b/test/internet/test-dns-setservers-type-check.js @@ -0,0 +1,88 @@ +'use strict'; +require('../common'); +const { addresses } = require('../common/internet'); +const assert = require('assert'); +const dns = require('dns'); +const resolver = new dns.promises.Resolver(); +const dnsPromises = dns.promises; +const promiseResolver = new dns.promises.Resolver(); + +{ + [ + null, + undefined, + Number(addresses.DNS4_SERVER), + addresses.DNS4_SERVER, + { + address: addresses.DNS4_SERVER + } + ].forEach((val) => { + const errObj = { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError [ERR_INVALID_ARG_TYPE]', + message: 'The "servers" argument must be of type Array. Received type ' + + typeof val + }; + assert.throws( + () => { + dns.setServers(val); + }, errObj + ); + assert.throws( + () => { + resolver.setServers(val); + }, errObj + ); + assert.throws( + () => { + dnsPromises.setServers(val); + }, errObj + ); + assert.throws( + () => { + promiseResolver.setServers(val); + }, errObj + ); + }); +} + +{ + [ + [null], + [undefined], + [Number(addresses.DNS4_SERVER)], + [addresses.DNS4_SERVER], + [ + { + address: addresses.DNS4_SERVER + } + ] + ].forEach((val) => { + const errObj = { + code: 'ERR_INVALID_ARG_TYPE', + name: 'TypeError [ERR_INVALID_ARG_TYPE]', + message: 'The "servers[0]" argument must be of type string.' + + `Received type ${typeof val[0]}` + }; + assert.throws( + () => { + dns.setServers(val); + }, errObj + ); + assert.throws( + () => { + resolver.setServers(val); + }, errObj + ); + assert.throws( + () => { + dnsPromises.setServers(val); + }, errObj + ); + assert.throws( + () => { + promiseResolver.setServers(val); + }, errObj + ); + }); +} From e68ca4f40e154a7fbe555ca6ad9c7ab4e6de0292 Mon Sep 17 00:00:00 2001 From: Masashi Hirano Date: Tue, 24 Jul 2018 07:38:07 +0900 Subject: [PATCH 2/3] test: move test-dns-setservers-type-check.js to test/parallel --- test/{internet => parallel}/test-dns-setservers-type-check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/{internet => parallel}/test-dns-setservers-type-check.js (99%) diff --git a/test/internet/test-dns-setservers-type-check.js b/test/parallel/test-dns-setservers-type-check.js similarity index 99% rename from test/internet/test-dns-setservers-type-check.js rename to test/parallel/test-dns-setservers-type-check.js index c896f810375444..2f1bf85a697a3d 100644 --- a/test/internet/test-dns-setservers-type-check.js +++ b/test/parallel/test-dns-setservers-type-check.js @@ -61,7 +61,7 @@ const promiseResolver = new dns.promises.Resolver(); const errObj = { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError [ERR_INVALID_ARG_TYPE]', - message: 'The "servers[0]" argument must be of type string.' + + message: 'The "servers[0]" argument must be of type string. ' + `Received type ${typeof val[0]}` }; assert.throws( From 14246c6553d1262cf233fdf644cf17ad21189926 Mon Sep 17 00:00:00 2001 From: Masashi Hirano Date: Tue, 24 Jul 2018 08:32:58 +0900 Subject: [PATCH 3/3] test: remove test value to check type in dns.setServers --- test/parallel/test-dns-setservers-type-check.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/parallel/test-dns-setservers-type-check.js b/test/parallel/test-dns-setservers-type-check.js index 2f1bf85a697a3d..256c029427b86a 100644 --- a/test/parallel/test-dns-setservers-type-check.js +++ b/test/parallel/test-dns-setservers-type-check.js @@ -51,7 +51,6 @@ const promiseResolver = new dns.promises.Resolver(); [null], [undefined], [Number(addresses.DNS4_SERVER)], - [addresses.DNS4_SERVER], [ { address: addresses.DNS4_SERVER