Skip to content

Commit f1419b8

Browse files
fuzzyTewbilliegoose
authored andcommitted
Fix for reading from nested symlinks (#35)
1 parent fb73aed commit f1419b8

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

src/CacheFS.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@ module.exports = class CacheFS {
108108
_lookup(filepath, follow = true) {
109109
let dir = this._root;
110110
let partialPath = '/'
111-
for (let part of path.split(filepath)) {
111+
let parts = path.split(filepath)
112+
for (let i = 0; i < parts.length; ++ i) {
113+
let part = parts[i];
112114
dir = dir.get(part);
113115
if (!dir) throw new ENOENT(filepath);
114116
// Follow symlinks
115-
if (follow) {
117+
if (follow || i < parts.length - 1) {
116118
const stat = dir.get(STAT)
117119
if (stat.type === 'symlink') {
118120
let target = stat.target

src/__tests__/fs.promises.spec.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,20 @@ describe("fs.promises module", () => {
430430
});
431431
});
432432
});
433+
it("readlink operates on paths with symlinks", done => {
434+
fs.mkdir("/readlink").finally(() => {
435+
fs.symlink("/readlink", "/readlink/sub").then(() => {
436+
fs.writeFile("/readlink/c.txt", "hello").then(() => {
437+
fs.symlink("/readlink/c.txt", "/readlink/d.txt").then(() => {
438+
fs.readlink("/readlink/sub/d.txt").then(data => {
439+
expect(data).toBe("/readlink/c.txt")
440+
done();
441+
});
442+
});
443+
});
444+
});
445+
});
446+
});
433447
});
434448

435449
});

src/__tests__/fs.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,21 @@ describe("fs module", () => {
427427
});
428428
});
429429
});
430+
it("readlink operates on paths with symlinks", done => {
431+
fs.mkdir("/readlink", () => {
432+
fs.symlink("/readlink", "/readlink/sub", () => {
433+
fs.writeFile("/readlink/c.txt", "hello", () => {
434+
fs.symlink("/readlink/c.txt", "/readlink/d.txt", () => {
435+
fs.readlink("/readlink/sub/d.txt", (err, data) => {
436+
expect(err).toBe(null)
437+
expect(data).toBe("/readlink/c.txt")
438+
done();
439+
});
440+
});
441+
});
442+
});
443+
});
444+
});
430445
});
431446

432447
});

0 commit comments

Comments
 (0)