mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
fs: fix existsSync for invalid symlink at win32
Fixes: https://github.com/nodejs/node/issues/30538 PR-URL: https://github.com/nodejs/node/pull/30556 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
committed by
Anna Henningsen
parent
3ebae6cf1b
commit
0e3d774ed2
11
lib/fs.js
11
lib/fs.js
@@ -234,7 +234,16 @@ function existsSync(path) {
|
||||
return false;
|
||||
}
|
||||
const ctx = { path };
|
||||
binding.access(pathModule.toNamespacedPath(path), F_OK, undefined, ctx);
|
||||
const nPath = pathModule.toNamespacedPath(path);
|
||||
binding.access(nPath, F_OK, undefined, ctx);
|
||||
|
||||
// In case of an invalid symlink, `binding.access()` on win32
|
||||
// will **not** return an error and is therefore not enough.
|
||||
// Double check with `binding.stat()`.
|
||||
if (isWindows && ctx.errno === undefined) {
|
||||
binding.stat(nPath, false, undefined, ctx);
|
||||
}
|
||||
|
||||
return ctx.errno === undefined;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,3 +53,20 @@ fs.symlink(linkData, linkPath, 'junction', common.mustCall(function(err) {
|
||||
}));
|
||||
}));
|
||||
}));
|
||||
|
||||
// Test invalid symlink
|
||||
{
|
||||
const linkData = fixtures.path('/not/exists/dir');
|
||||
const linkPath = path.join(tmpdir.path, 'invalid_junction_link');
|
||||
|
||||
fs.symlink(linkData, linkPath, 'junction', common.mustCall(function(err) {
|
||||
assert.ifError(err);
|
||||
|
||||
assert(!fs.existsSync(linkPath));
|
||||
|
||||
fs.unlink(linkPath, common.mustCall(function(err) {
|
||||
assert.ifError(err);
|
||||
assert(!fs.existsSync(linkPath));
|
||||
}));
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -44,3 +44,25 @@ for (const linkTarget of linkTargets) {
|
||||
testAsync(linkTarget, `${linkPath}-${path.basename(linkTarget)}-async`);
|
||||
}
|
||||
}
|
||||
|
||||
// Test invalid symlink
|
||||
{
|
||||
function testSync(target, path) {
|
||||
fs.symlinkSync(target, path);
|
||||
assert(!fs.existsSync(path));
|
||||
}
|
||||
|
||||
function testAsync(target, path) {
|
||||
fs.symlink(target, path, common.mustCall((err) => {
|
||||
assert.ifError(err);
|
||||
assert(!fs.existsSync(path));
|
||||
}));
|
||||
}
|
||||
|
||||
for (const linkTarget of linkTargets.map((p) => p + '-broken')) {
|
||||
for (const linkPath of linkPaths) {
|
||||
testSync(linkTarget, `${linkPath}-${path.basename(linkTarget)}-sync`);
|
||||
testAsync(linkTarget, `${linkPath}-${path.basename(linkTarget)}-async`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +58,18 @@ fs.symlink(linkData, linkPath, common.mustCall(function(err) {
|
||||
}));
|
||||
}));
|
||||
|
||||
// Test invalid symlink
|
||||
{
|
||||
const linkData = fixtures.path('/not/exists/file');
|
||||
const linkPath = path.join(tmpdir.path, 'symlink2.js');
|
||||
|
||||
fs.symlink(linkData, linkPath, common.mustCall(function(err) {
|
||||
assert.ifError(err);
|
||||
|
||||
assert(!fs.existsSync(linkPath));
|
||||
}));
|
||||
}
|
||||
|
||||
[false, 1, {}, [], null, undefined].forEach((input) => {
|
||||
const errObj = {
|
||||
code: 'ERR_INVALID_ARG_TYPE',
|
||||
|
||||
Reference in New Issue
Block a user