summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2018-10-10 20:23:48 +0200
committerAnna Henningsen <anna@addaleax.net>2019-01-28 20:42:44 +0100
commitf399b01dc4dbb47f678301aea6f476527889b959 (patch)
tree55fda98222b9eb7c77990cb0053ed8d8a3ec3eff /lib
parent48149876dd195bb2bb072a1d8b1cb3ef0b9ae15d (diff)
downloadandroid-node-v8-f399b01dc4dbb47f678301aea6f476527889b959.tar.gz
android-node-v8-f399b01dc4dbb47f678301aea6f476527889b959.tar.bz2
android-node-v8-f399b01dc4dbb47f678301aea6f476527889b959.zip
dns: use IDNA 2008 to encode non-ascii hostnames
Before this commit, Node.js left it up to the system resolver or c-ares. Leaving it to the system resolver introduces platform differences because: * some support IDNA 2008 * some only IDNA 2003 (glibc until 2.28), and * some don't support IDNA at all (musl libc) c-ares doesn't support IDNA either although curl does, by virtue of linking against libidn2. Upgrading from libidn1 to libidn2 in order to get proper IDNA 2008 support was the fix for curl's CVE-2016-8625. libidn2 is not an option (incompatible license) but ICU has an IDNA API and we already use that in one place. For non-ICU builds, we fall back to the bundled punycode.js that also supports IDNA 2008. Fixes: https://github.com/nodejs-private/security/issues/97 Fixes: https://github.com/nodejs/node/issues/25558 PR-URL: https://github.com/nodejs/node/pull/25679 Reviewed-By: Santiago Gimeno <santiago.gimeno@gmail.com> Reviewed-By: Saúl Ibarra Corretgé <saghul@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/dns.js5
-rw-r--r--lib/internal/dns/promises.js5
-rw-r--r--lib/internal/idna.js9
-rw-r--r--lib/url.js5
4 files changed, 16 insertions, 8 deletions
diff --git a/lib/dns.js b/lib/dns.js
index f68409f2ee..952ef39006 100644
--- a/lib/dns.js
+++ b/lib/dns.js
@@ -22,6 +22,7 @@
'use strict';
const cares = internalBinding('cares_wrap');
+const { toASCII } = require('internal/idna');
const { isIP, isIPv4, isLegalPort } = require('internal/net');
const { customPromisifyArgs } = require('internal/util');
const errors = require('internal/errors');
@@ -139,7 +140,7 @@ function lookup(hostname, options, callback) {
req.hostname = hostname;
req.oncomplete = all ? onlookupall : onlookup;
- var err = cares.getaddrinfo(req, hostname, family, hints, verbatim);
+ var err = cares.getaddrinfo(req, toASCII(hostname), family, hints, verbatim);
if (err) {
process.nextTick(callback, dnsException(err, 'getaddrinfo', hostname));
return {};
@@ -219,7 +220,7 @@ function resolver(bindingName) {
req.hostname = name;
req.oncomplete = onresolve;
req.ttl = !!(options && options.ttl);
- var err = this._handle[bindingName](req, name);
+ var err = this._handle[bindingName](req, toASCII(name));
if (err) throw dnsException(err, bindingName, name);
return req;
}
diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js
index be49ebf210..25696bf222 100644
--- a/lib/internal/dns/promises.js
+++ b/lib/internal/dns/promises.js
@@ -6,6 +6,7 @@ const {
emitInvalidHostnameWarning,
} = require('internal/dns/utils');
const { codes, dnsException } = require('internal/errors');
+const { toASCII } = require('internal/idna');
const { isIP, isIPv4, isLegalPort } = require('internal/net');
const {
getaddrinfo,
@@ -86,7 +87,7 @@ function createLookupPromise(family, hostname, all, hints, verbatim) {
req.resolve = resolve;
req.reject = reject;
- const err = getaddrinfo(req, hostname, family, hints, verbatim);
+ const err = getaddrinfo(req, toASCII(hostname), family, hints, verbatim);
if (err) {
reject(dnsException(err, 'getaddrinfo', hostname));
@@ -184,7 +185,7 @@ function createResolverPromise(resolver, bindingName, hostname, ttl) {
req.reject = reject;
req.ttl = ttl;
- const err = resolver._handle[bindingName](req, hostname);
+ const err = resolver._handle[bindingName](req, toASCII(hostname));
if (err)
reject(dnsException(err, bindingName, hostname));
diff --git a/lib/internal/idna.js b/lib/internal/idna.js
new file mode 100644
index 0000000000..409cabedf1
--- /dev/null
+++ b/lib/internal/idna.js
@@ -0,0 +1,9 @@
+'use strict';
+
+if (process.binding('config').hasIntl) {
+ const { toASCII, toUnicode } = internalBinding('icu');
+ module.exports = { toASCII, toUnicode };
+} else {
+ const { toASCII, toUnicode } = require('punycode');
+ module.exports = { toASCII, toUnicode };
+}
diff --git a/lib/url.js b/lib/url.js
index 9755cf430a..569733bfc4 100644
--- a/lib/url.js
+++ b/lib/url.js
@@ -21,11 +21,8 @@
'use strict';
-const { toASCII } = internalBinding('config').hasIntl ?
- internalBinding('icu') : require('punycode');
-
+const { toASCII } = require('internal/idna');
const { hexTable } = require('internal/querystring');
-
const { SafeSet } = require('internal/safe_globals');
const {