diff --git a/node_modules/vfs-local/localfs.js b/node_modules/vfs-local/localfs.js index f9376f77..1984e00d 100644 --- a/node_modules/vfs-local/localfs.js +++ b/node_modules/vfs-local/localfs.js @@ -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); }); }); } diff --git a/plugins/c9.fs/fs.cache.xml.js b/plugins/c9.fs/fs.cache.xml.js index dda745dd..c9ad1844 100644 --- a/plugins/c9.fs/fs.cache.xml.js +++ b/plugins/c9.fs/fs.cache.xml.js @@ -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; }