summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeijia Wang <381152119@qq.com>2018-01-04 11:55:56 +0800
committerWeijia Wang <381152119@qq.com>2018-01-11 11:11:22 +0800
commit315d1f553de9c1c5cf0ab9ee2623b5420bee8a09 (patch)
treecdbd5c3165838f59e996bbcad8adb40bbffe1736
parent8aec3638cebd338b0ea2a62c3e1469b8e29616d7 (diff)
downloadnode-new-315d1f553de9c1c5cf0ab9ee2623b5420bee8a09.tar.gz
path: fix path.normalize for relative paths
After slicing, the `lastSegmentLength` should be calculated again, instead of assigning value `j`. PR-URL: https://github.com/nodejs/node/pull/17974 Fixes: https://github.com/nodejs/node/issues/17928 Reviewed-By: Michaƫl Zasso <targos@protonmail.com> Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com>
-rw-r--r--lib/path.js30
-rw-r--r--test/parallel/test-path-normalize.js24
2 files changed, 34 insertions, 20 deletions
diff --git a/lib/path.js b/lib/path.js
index e9f76bce99..eca4fcb9d2 100644
--- a/lib/path.js
+++ b/lib/path.js
@@ -51,19 +51,14 @@ function normalizeStringWin32(path, allowAboveRoot) {
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
res.charCodeAt(res.length - 2) !== 46/*.*/) {
if (res.length > 2) {
- const start = res.length - 1;
- var j = start;
- for (; j >= 0; --j) {
- if (res.charCodeAt(j) === 92/*\*/)
- break;
- }
- if (j !== start) {
- if (j === -1) {
+ const lastSlashIndex = res.lastIndexOf('\\');
+ if (lastSlashIndex !== res.length - 1) {
+ if (lastSlashIndex === -1) {
res = '';
lastSegmentLength = 0;
} else {
- res = res.slice(0, j);
- lastSegmentLength = j;
+ res = res.slice(0, lastSlashIndex);
+ lastSegmentLength = res.length - 1 - res.lastIndexOf('\\');
}
lastSlash = i;
dots = 0;
@@ -124,19 +119,14 @@ function normalizeStringPosix(path, allowAboveRoot) {
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
res.charCodeAt(res.length - 2) !== 46/*.*/) {
if (res.length > 2) {
- const start = res.length - 1;
- var j = start;
- for (; j >= 0; --j) {
- if (res.charCodeAt(j) === 47/*/*/)
- break;
- }
- if (j !== start) {
- if (j === -1) {
+ const lastSlashIndex = res.lastIndexOf('/');
+ if (lastSlashIndex !== res.length - 1) {
+ if (lastSlashIndex === -1) {
res = '';
lastSegmentLength = 0;
} else {
- res = res.slice(0, j);
- lastSegmentLength = j;
+ res = res.slice(0, lastSlashIndex);
+ lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
}
lastSlash = i;
dots = 0;
diff --git a/test/parallel/test-path-normalize.js b/test/parallel/test-path-normalize.js
index 0820052446..0dd1b8339f 100644
--- a/test/parallel/test-path-normalize.js
+++ b/test/parallel/test-path-normalize.js
@@ -27,6 +27,18 @@ assert.strictEqual(path.win32.normalize('..\\foo..\\..\\..\\bar'),
'..\\..\\bar');
assert.strictEqual(path.win32.normalize('..\\...\\..\\.\\...\\..\\..\\bar'),
'..\\..\\bar');
+assert.strictEqual(path.win32.normalize('../../../foo/../../../bar'),
+ '..\\..\\..\\..\\..\\bar');
+assert.strictEqual(path.win32.normalize('../../../foo/../../../bar/../../'),
+ '..\\..\\..\\..\\..\\..\\');
+assert.strictEqual(
+ path.win32.normalize('../foobar/barfoo/foo/../../../bar/../../'),
+ '..\\..\\'
+);
+assert.strictEqual(
+ path.win32.normalize('../.../../foobar/../../../bar/../../baz'),
+ '..\\..\\..\\..\\baz'
+);
assert.strictEqual(path.posix.normalize('./fixtures///b/../b/c.js'),
'fixtures/b/c.js');
@@ -44,3 +56,15 @@ assert.strictEqual(path.posix.normalize('bar/foo..'), 'bar/foo..');
assert.strictEqual(path.posix.normalize('../foo../../../bar'), '../../bar');
assert.strictEqual(path.posix.normalize('../.../.././.../../../bar'),
'../../bar');
+assert.strictEqual(path.posix.normalize('../../../foo/../../../bar'),
+ '../../../../../bar');
+assert.strictEqual(path.posix.normalize('../../../foo/../../../bar/../../'),
+ '../../../../../../');
+assert.strictEqual(
+ path.posix.normalize('../foobar/barfoo/foo/../../../bar/../../'),
+ '../../'
+);
+assert.strictEqual(
+ path.posix.normalize('../.../../foobar/../../../bar/../../baz'),
+ '../../../../baz'
+);