Skip to content

Commit 4274adf

Browse files
authored
Fix FS.mkdirTree with relative paths (#23902)
Split out from #23897
1 parent 4027efa commit 4274adf

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

src/lib/libfs.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,8 @@ FS.staticInit();
748748
var d = '';
749749
for (var dir of dirs) {
750750
if (!dir) continue;
751-
d += '/' + dir;
751+
if (d || PATH.isAbs(path)) d += '/';
752+
d += dir;
752753
try {
753754
FS.mkdir(d, mode);
754755
} catch(e) {

src/lib/libwasmfs.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,8 @@ addToLibrary({
542542
var d = '';
543543
for (var dir of dirs) {
544544
if (!dir) continue;
545-
d += '/' + dir;
545+
if (d || PATH.isAbs(path)) d += '/';
546+
d += dir;
546547
try {
547548
FS_mkdir(d, mode);
548549
} catch(e) {

test/fs/test_fs_js_api.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -381,20 +381,19 @@ void test_fs_mmap() {
381381

382382
void test_fs_mkdirTree() {
383383
EM_ASM(
384-
FS.mkdirTree("/test1/test2/test3");
385-
384+
FS.mkdirTree("/test1/test2/test3"); // Abs path
386385
FS.mkdirTree("/readable", 0400 /* S_IRUSR */);
387386
);
388387

389388
struct stat s;
390-
stat("/test1", &s);
389+
assert(stat("/test1", &s) == 0);
391390
assert(S_ISDIR(s.st_mode));
392-
stat("/test1/test2", &s);
391+
assert(stat("/test1/test2", &s) == 0);
393392
assert(S_ISDIR(s.st_mode));
394-
stat("/test1/test2/test3", &s);
393+
assert(stat("/test1/test2/test3", &s) == 0);
395394
assert(S_ISDIR(s.st_mode));
396395

397-
stat("/readable", &s);
396+
assert(stat("/readable", &s) == 0);
398397
assert(s.st_mode & 0400 /* S_IRUSR */);
399398

400399
EM_ASM(
@@ -407,8 +406,22 @@ void test_fs_mkdirTree() {
407406
assert(ex.name === "ErrnoError" && ex.errno === 2 /* EACCES */);
408407
);
409408

409+
chdir("test1");
410+
EM_ASM(
411+
FS.mkdirTree("foo/bar"); // Relative path
412+
);
413+
chdir("/");
414+
415+
assert(stat("/test1/foo", &s) == 0);
416+
assert(S_ISDIR(s.st_mode));
417+
418+
assert(stat("/test1/foo/bar", &s) == 0);
419+
assert(S_ISDIR(s.st_mode));
420+
410421
remove("/test1/test2/test3");
411422
remove("/test1/test2");
423+
remove("/test1/foo/bar");
424+
remove("/test1/foo");
412425
remove("/test1");
413426
remove("/readable");
414427
}

0 commit comments

Comments
 (0)