From 668632d531389e862d2842db3474940a2aa3a449 Mon Sep 17 00:00:00 2001 From: Stewart Addison Date: Tue, 14 Jul 2020 14:30:44 +0100 Subject: [PATCH] net: allow wider regex in interface name Zone IDs on Linux are network interface names. The regex we use to determine valid IPs does not allow for non-alphanumeric characters in the zone ID suffix. Some machines (including the RHEL Linux/s390x machines from Marist) have zone IDs with a '.' character in them which the regex in net.isIP rejects. This changes the regex. Ref: https://github.com/nodejs/node/pull/14500 Signed-off-by: Stewart Addison PR-URL: https://github.com/nodejs/node/pull/34364 Reviewed-By: Anna Henningsen Reviewed-By: Richard Lau Reviewed-By: Luigi Pinca Reviewed-By: Ben Noordhuis Reviewed-By: Rich Trott Reviewed-By: Michael Dawson --- lib/internal/net.js | 2 +- test/parallel/test-net-isip.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/internal/net.js b/lib/internal/net.js index 4a9a156aeabf66..2df1d5d5f613d2 100644 --- a/lib/internal/net.js +++ b/lib/internal/net.js @@ -25,7 +25,7 @@ const IPv6Reg = new RegExp('^(' + `(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|` + `(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|` + `(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:))` + -')(%[0-9a-zA-Z]{1,})?$'); +')(%[0-9a-zA-Z-.:]{1,})?$'); function isIPv4(s) { return IPv4Reg.test(s); diff --git a/test/parallel/test-net-isip.js b/test/parallel/test-net-isip.js index e9a8749aaee412..840ffe76af9a30 100644 --- a/test/parallel/test-net-isip.js +++ b/test/parallel/test-net-isip.js @@ -46,6 +46,9 @@ assert.strictEqual(net.isIP('::2001:252:1:2008:6'), 6); assert.strictEqual(net.isIP('::2001:252:1:1.1.1.1'), 6); assert.strictEqual(net.isIP('::2001:252:1:255.255.255.255'), 6); assert.strictEqual(net.isIP('::2001:252:1:255.255.255.255.76'), 0); +assert.strictEqual(net.isIP('fe80::2008%eth0'), 6); +assert.strictEqual(net.isIP('fe80::2008%eth0.0'), 6); +assert.strictEqual(net.isIP('fe80::2008%eth0@1'), 0); assert.strictEqual(net.isIP('::anything'), 0); assert.strictEqual(net.isIP('::1'), 6); assert.strictEqual(net.isIP('::'), 6);