Revert "Revert "fix symlink loop detection""

pull/223/head
Harutyun Amirjanyan 2015-10-22 19:33:41 +04:00 zatwierdzone przez nightwing
rodzic 903ab6f1d8
commit a1b273b6e1
2 zmienionych plików z 21 dodań i 18 usunięć

35
node_modules/vfs-local/localfs.js wygenerowano vendored
Wyświetl plik

@ -350,7 +350,7 @@ module.exports = function setup(fsOptions) {
// This helper function doesn't follow node conventions in the callback,
// there is no err, only entry.
function createStatEntry(file, fullpath, callback) {
function createStatEntry(file, fullpath, callback, _loop) {
fs.lstat(fullpath, function (err, stat) {
var entry = {
name: file
@ -378,26 +378,29 @@ module.exports = function setup(fsOptions) {
return callback(entry);
}
fs.readlink(fullpath, function (err, link) {
if (entry.name == link) {
entry.linkStatErr = "ELOOP: recursive symlink";
return callback(entry);
}
if (err) {
entry.linkErr = err.stack;
return callback(entry);
}
var fullLinkPath = pathResolve(dirname(fullpath), link);
if (!_loop) {
_loop = {fullLinkPath: fullpath, max: 100};
}
if (fullLinkPath.toLowerCase() == _loop.fullLinkPath.toLowerCase() || _loop.max --< 0) {
entry.linkErr = "ELOOP: recursive symlink";
return callback(entry);
}
entry.link = link;
resolvePath(pathResolve(dirname(fullpath), link), {alreadyRooted: true}, function (err, newpath) {
if (err) {
entry.linkStatErr = err;
return callback(entry);
}
createStatEntry(basename(newpath), newpath, function (linkStat) {
entry.linkStat = linkStat;
linkStat.fullPath = newpath.substr(base.length) || "/";
return callback(entry);
});
resolvePath(fullLinkPath, {alreadyRooted: true}, function (err, newpath) {
if (err) {
entry.linkErr = err;
return callback(entry);
}
createStatEntry(basename(newpath), newpath, function (linkStat) {
entry.linkStat = linkStat;
linkStat.fullPath = newpath.substr(base.length) || "/";
return callback(entry);
}, _loop);
});
});
}

Wyświetl plik

@ -561,8 +561,8 @@ define(function(require, exports, module) {
node.size = stat.size;
if (stat.mtime != undefined)
node.mtime = stat.mtime;
if (original_stat)
node.link = stat.fullPath;
if (original_stat || stat.linkErr)
node.link = stat.fullPath || stat.linkErr;
node.isFolder = isFolder;
}