Commit 62229c0
committed
vfs: prevent stack overflow in recursive readdir on circular symlinks
MemoryProvider#readdirSync with `recursive: true` follows symlinks to
directories during traversal but did not bound the number of symlinks
followed along a branch. A circular symlink therefore caused unbounded
recursion in the internal walk() helper until the call stack was
exhausted, crashing the process with `RangeError: Maximum call stack
size exceeded`. Both the synchronous and promise-based variants were
affected. The existing kMaxSymlinkDepth guard in #lookupEntry did not
help, because walk() resolved each symlink target with a fresh depth of
zero.
Track the number of symlink hops along the current branch and stop
recursing once it would exceed kMaxSymlinkDepth, mirroring the ELOOP
guard in #lookupEntry and the behavior of the real filesystem, which
follows directory symlinks until the OS symlink limit is reached. The
entries themselves are still listed, so non-circular symlinks continue
to be followed as before.
Fixes: #64148
Signed-off-by: AkshatOP <hunterdevil0987@gmail.com>1 parent 74567b2 commit 62229c0
2 files changed
Lines changed: 63 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
612 | 612 | | |
613 | 613 | | |
614 | 614 | | |
615 | | - | |
| 615 | + | |
616 | 616 | | |
617 | 617 | | |
618 | 618 | | |
| |||
636 | 636 | | |
637 | 637 | | |
638 | 638 | | |
| 639 | + | |
639 | 640 | | |
640 | 641 | | |
641 | 642 | | |
| |||
644 | 645 | | |
645 | 646 | | |
646 | 647 | | |
| 648 | + | |
| 649 | + | |
647 | 650 | | |
648 | | - | |
| 651 | + | |
| 652 | + | |
649 | 653 | | |
650 | | - | |
| 654 | + | |
651 | 655 | | |
652 | 656 | | |
653 | 657 | | |
654 | 658 | | |
655 | | - | |
| 659 | + | |
656 | 660 | | |
657 | 661 | | |
658 | 662 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
0 commit comments