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>
This commit is contained in:
parent
8aec3638ce
commit
315d1f553d
30
lib/path.js
30
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;
|
||||
|
@ -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'
|
||||
);
|
||||
|
Loading…
x
Reference in New Issue
Block a user