From 4e1c4e81934e28dd4731a910fbed7d8fd2519bf4 Mon Sep 17 00:00:00 2001 From: Masashi Hirano Date: Mon, 23 Jul 2018 18:49:36 +0900 Subject: [PATCH] dns: type check for dns.setServers argument. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added type check for argument for dns.setServers and dnsPromises.setServers. PR-URL: https://github.com/nodejs/node/pull/21944 Reviewed-By: Colin Ihrig Reviewed-By: Anna Henningsen Reviewed-By: Trivikram Kamat Reviewed-By: James M Snell Reviewed-By: Jon Moss Reviewed-By: Yuta Hiroto Reviewed-By: Tobias Nießen Reviewed-By: Сковорода Никита Андреевич --- lib/internal/dns/utils.js | 10 ++- .../test-dns-setservers-type-check.js | 87 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-dns-setservers-type-check.js diff --git a/lib/internal/dns/utils.js b/lib/internal/dns/utils.js index 43b65418848..f6bace7528f 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/parallel/test-dns-setservers-type-check.js b/test/parallel/test-dns-setservers-type-check.js new file mode 100644 index 00000000000..256c029427b --- /dev/null +++ b/test/parallel/test-dns-setservers-type-check.js @@ -0,0 +1,87 @@ +'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)], + [ + { + 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 + ); + }); +}