Skip to content

Commit 470832f

Browse files
starkwangevanlucas
authored andcommitted
path: fix path.normalize for relative paths
After slicing, the `lastSegmentLength` should be calculated again, instead of assigning value `j`. PR-URL: #17974 Fixes: #17928 Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Gibson Fahnestock <[email protected]>
1 parent 5ebd017 commit 470832f

File tree

2 files changed

+34
-20
lines changed

2 files changed

+34
-20
lines changed

lib/path.js

+10-20
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,14 @@ function normalizeStringWin32(path, allowAboveRoot) {
5151
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
5252
res.charCodeAt(res.length - 2) !== 46/*.*/) {
5353
if (res.length > 2) {
54-
const start = res.length - 1;
55-
var j = start;
56-
for (; j >= 0; --j) {
57-
if (res.charCodeAt(j) === 92/*\*/)
58-
break;
59-
}
60-
if (j !== start) {
61-
if (j === -1) {
54+
const lastSlashIndex = res.lastIndexOf('\\');
55+
if (lastSlashIndex !== res.length - 1) {
56+
if (lastSlashIndex === -1) {
6257
res = '';
6358
lastSegmentLength = 0;
6459
} else {
65-
res = res.slice(0, j);
66-
lastSegmentLength = j;
60+
res = res.slice(0, lastSlashIndex);
61+
lastSegmentLength = res.length - 1 - res.lastIndexOf('\\');
6762
}
6863
lastSlash = i;
6964
dots = 0;
@@ -124,19 +119,14 @@ function normalizeStringPosix(path, allowAboveRoot) {
124119
res.charCodeAt(res.length - 1) !== 46/*.*/ ||
125120
res.charCodeAt(res.length - 2) !== 46/*.*/) {
126121
if (res.length > 2) {
127-
const start = res.length - 1;
128-
var j = start;
129-
for (; j >= 0; --j) {
130-
if (res.charCodeAt(j) === 47/*/*/)
131-
break;
132-
}
133-
if (j !== start) {
134-
if (j === -1) {
122+
const lastSlashIndex = res.lastIndexOf('/');
123+
if (lastSlashIndex !== res.length - 1) {
124+
if (lastSlashIndex === -1) {
135125
res = '';
136126
lastSegmentLength = 0;
137127
} else {
138-
res = res.slice(0, j);
139-
lastSegmentLength = j;
128+
res = res.slice(0, lastSlashIndex);
129+
lastSegmentLength = res.length - 1 - res.lastIndexOf('/');
140130
}
141131
lastSlash = i;
142132
dots = 0;

test/parallel/test-path-normalize.js

+24
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ assert.strictEqual(path.win32.normalize('..\\foo..\\..\\..\\bar'),
2727
'..\\..\\bar');
2828
assert.strictEqual(path.win32.normalize('..\\...\\..\\.\\...\\..\\..\\bar'),
2929
'..\\..\\bar');
30+
assert.strictEqual(path.win32.normalize('../../../foo/../../../bar'),
31+
'..\\..\\..\\..\\..\\bar');
32+
assert.strictEqual(path.win32.normalize('../../../foo/../../../bar/../../'),
33+
'..\\..\\..\\..\\..\\..\\');
34+
assert.strictEqual(
35+
path.win32.normalize('../foobar/barfoo/foo/../../../bar/../../'),
36+
'..\\..\\'
37+
);
38+
assert.strictEqual(
39+
path.win32.normalize('../.../../foobar/../../../bar/../../baz'),
40+
'..\\..\\..\\..\\baz'
41+
);
3042

3143
assert.strictEqual(path.posix.normalize('./fixtures///b/../b/c.js'),
3244
'fixtures/b/c.js');
@@ -44,3 +56,15 @@ assert.strictEqual(path.posix.normalize('bar/foo..'), 'bar/foo..');
4456
assert.strictEqual(path.posix.normalize('../foo../../../bar'), '../../bar');
4557
assert.strictEqual(path.posix.normalize('../.../.././.../../../bar'),
4658
'../../bar');
59+
assert.strictEqual(path.posix.normalize('../../../foo/../../../bar'),
60+
'../../../../../bar');
61+
assert.strictEqual(path.posix.normalize('../../../foo/../../../bar/../../'),
62+
'../../../../../../');
63+
assert.strictEqual(
64+
path.posix.normalize('../foobar/barfoo/foo/../../../bar/../../'),
65+
'../../'
66+
);
67+
assert.strictEqual(
68+
path.posix.normalize('../.../../foobar/../../../bar/../../baz'),
69+
'../../../../baz'
70+
);

0 commit comments

Comments
 (0)