Skip to content

Commit cc1de1a

Browse files
authored
JS FS: Don't return ELOOP on a path with a large number of ..'s (#24591)
Decrement nlinks before doing `continue linkloop;` due to a .. at a file system loop. We're not actually traversing a symlink here. Caught by the Python test suite.
1 parent bbe1752 commit cc1de1a

22 files changed

+38
-20
lines changed

src/lib/libfs.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ FS.staticInit();`;
197197
current_path = PATH.dirname(current_path);
198198
if (FS.isRoot(current)) {
199199
path = current_path + '/' + parts.slice(i + 1).join('/');
200+
// We're making progress here, don't let many consecutive ..'s
201+
// lead to ELOOP
202+
nlinks--;
200203
continue linkloop;
201204
} else {
202205
current = current.parent;
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8167
1+
8171
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19798
1+
19802
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8155
1+
8160
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19776
1+
19780
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9154
1+
9159
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23459
1+
23463
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8115
1+
8119
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19687
1+
19691
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8115
1+
8119
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19687
1+
19691
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8019
1+
8023
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19502
1+
19506
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9171
1+
9176
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
23509
1+
23513
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
8167
1+
8171
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
19798
1+
19802
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
7480
1+
7485
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
18401
1+
18405
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
11562
1+
11568
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
27310
1+
27314

test/test_other.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6070,6 +6070,21 @@ def test_symlink_silly(self):
60706070
self.assertContained(r'ok', self.run_js('a.out.js', args=['123', 'abc']))
60716071
self.assertContained(r'Failed to symlink paths: abc, ; errno=44', self.run_js('a.out.js', args=['abc', '']))
60726072

6073+
@with_all_fs
6074+
def test_stat_many_dotdot(self):
6075+
path = "/".join([".."] * 75)
6076+
create_file('main.c', '''
6077+
#include <stdio.h>
6078+
#include <errno.h>
6079+
#include <sys/stat.h>
6080+
6081+
int main() {
6082+
struct stat path_stat;
6083+
return stat("%s", &path_stat);
6084+
}
6085+
''' % path)
6086+
self.do_runf('main.c')
6087+
60736088
def test_rename_silly(self):
60746089
create_file('src.c', r'''
60756090
#include <stdio.h>

0 commit comments

Comments
 (0)