From afaf1dc9f44d3ea1639b77468e72753f44d50f7e Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 14:37:57 +0100 Subject: [PATCH 01/11] Trying to create a directory in a file should return ENOTDIR not EPERM In linux, `mkdir("some_file/dir")` returns `ENOTDIR` but Emscripten returns `EPERM`. This fixes it. --- src/library_fs.js | 3 +++ src/library_memfs.js | 2 +- test/test_core.py | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/library_fs.js b/src/library_fs.js index bbc0dd987ab7f..2b51b28279af4 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -376,6 +376,9 @@ FS.staticInit(); var node = FS.lookupNode(dir, name); return {{{ cDefs.EEXIST }}}; } catch (e) { + if (e.errno === {{{ cDefs.ENOTDIR }}}) { + return {{{ cDefs.ENOTDIR }}}; + } } return FS.nodePermissions(dir, 'wx'); }, diff --git a/src/library_memfs.js b/src/library_memfs.js index b4beccd08aadf..22e91ede1ffeb 100644 --- a/src/library_memfs.js +++ b/src/library_memfs.js @@ -7,7 +7,7 @@ addToLibrary({ $MEMFS__deps: ['$FS', '$mmapAlloc'], #if !ASSERTIONS - $MEMFS__postset: ` + $MEMFS__preset: ` // This error may happen quite a bit. To avoid overhead we reuse it (and // suffer a lack of stack info). MEMFS.doesNotExistError = new FS.ErrnoError({{{ cDefs.ENOENT }}}); diff --git a/test/test_core.py b/test/test_core.py index aceca825ff988..1485dd4540c5f 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5822,6 +5822,10 @@ def test_fs_write(self): def test_fs_emptyPath(self): self.do_run_in_out_file_test('fs/test_emptyPath.c') + @also_with_noderawfs + def test_enotdir(self): + self.do_run_in_out_file_test('fs/test_enotdir.c') + @also_with_noderawfs def test_fs_append(self): self.do_runf('fs/test_append.c', 'success') From 10450a7ba38901a5bdf783822e526a71f799cc8f Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 14:47:11 +0100 Subject: [PATCH 02/11] Check if isDir first --- src/library_fs.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/library_fs.js b/src/library_fs.js index 2b51b28279af4..cc73441bcc0a6 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -372,14 +372,13 @@ FS.staticInit(); return 0; }, mayCreate(dir, name) { + if (!FS.isDir(dir)) { + return {{{ cDefs.ENOTDIR }}}; + } try { var node = FS.lookupNode(dir, name); return {{{ cDefs.EEXIST }}}; - } catch (e) { - if (e.errno === {{{ cDefs.ENOTDIR }}}) { - return {{{ cDefs.ENOTDIR }}}; - } - } + } catch (e) { } return FS.nodePermissions(dir, 'wx'); }, mayDelete(dir, name, isdir) { From ed283ab6e7025c179971e4b5471e47983d8e1295 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 14:47:54 +0100 Subject: [PATCH 03/11] Cleanup --- src/library_fs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/library_fs.js b/src/library_fs.js index cc73441bcc0a6..fd6cf7b8a3db1 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -378,7 +378,8 @@ FS.staticInit(); try { var node = FS.lookupNode(dir, name); return {{{ cDefs.EEXIST }}}; - } catch (e) { } + } catch (e) { + } return FS.nodePermissions(dir, 'wx'); }, mayDelete(dir, name, isdir) { From d512eb422d1e9fa5056a1a0b773198ff907413a0 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 14:49:02 +0100 Subject: [PATCH 04/11] Revert memfs change --- src/library_memfs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_memfs.js b/src/library_memfs.js index 22e91ede1ffeb..b4beccd08aadf 100644 --- a/src/library_memfs.js +++ b/src/library_memfs.js @@ -7,7 +7,7 @@ addToLibrary({ $MEMFS__deps: ['$FS', '$mmapAlloc'], #if !ASSERTIONS - $MEMFS__preset: ` + $MEMFS__postset: ` // This error may happen quite a bit. To avoid overhead we reuse it (and // suffer a lack of stack info). MEMFS.doesNotExistError = new FS.ErrnoError({{{ cDefs.ENOENT }}}); From b26e10dbffc11efd09e4727a19d0872eb75b79bc Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 14:52:35 +0100 Subject: [PATCH 05/11] Add test files --- test/fs/test_enotdir.c | 17 +++++++++++++++++ test/fs/test_enotdir.out | 1 + 2 files changed, 18 insertions(+) create mode 100644 test/fs/test_enotdir.c create mode 100644 test/fs/test_enotdir.out diff --git a/test/fs/test_enotdir.c b/test/fs/test_enotdir.c new file mode 100644 index 0000000000000..fe17a1ef50bcd --- /dev/null +++ b/test/fs/test_enotdir.c @@ -0,0 +1,17 @@ +#include +#include +#include +#include +#include +#include + +int main() { + { + int src_fd = open("file", O_CREAT | O_WRONLY, 0777); + close(src_fd); + } + { + int target_fd = mkdir("file/blah", 0777); + printf("target_fd: %d, errno: %d %s\n", target_fd, errno, strerror(errno)); + } +} diff --git a/test/fs/test_enotdir.out b/test/fs/test_enotdir.out new file mode 100644 index 0000000000000..55c2464fc101c --- /dev/null +++ b/test/fs/test_enotdir.out @@ -0,0 +1 @@ +target_fd: -1, errno: 54 Not a directory From 23de84648b529c8839fc719142fa30fdb9e1f320 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 15:00:19 +0100 Subject: [PATCH 06/11] Fix --- src/library_fs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/library_fs.js b/src/library_fs.js index fd6cf7b8a3db1..4d2d972f294db 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -372,7 +372,7 @@ FS.staticInit(); return 0; }, mayCreate(dir, name) { - if (!FS.isDir(dir)) { + if (!FS.isDir(dir.mode)) { return {{{ cDefs.ENOTDIR }}}; } try { From d9ac45216e8d25f25179b33991b2bc638f529b0a Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 27 Nov 2024 20:46:33 +0100 Subject: [PATCH 07/11] Address review comment --- test/test_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_core.py b/test/test_core.py index 1485dd4540c5f..343fb573cb5d8 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5823,7 +5823,7 @@ def test_fs_emptyPath(self): self.do_run_in_out_file_test('fs/test_emptyPath.c') @also_with_noderawfs - def test_enotdir(self): + def test_fs_enotdir(self): self.do_run_in_out_file_test('fs/test_enotdir.c') @also_with_noderawfs From 0e7d41a8935ce81a19f5c4357c14d01c3a47ce47 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 28 Nov 2024 00:06:43 +0100 Subject: [PATCH 08/11] Fix indentation --- test/fs/test_enotdir.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/fs/test_enotdir.c b/test/fs/test_enotdir.c index fe17a1ef50bcd..0f9bb5f4509ad 100644 --- a/test/fs/test_enotdir.c +++ b/test/fs/test_enotdir.c @@ -6,12 +6,12 @@ #include int main() { - { - int src_fd = open("file", O_CREAT | O_WRONLY, 0777); - close(src_fd); - } - { - int target_fd = mkdir("file/blah", 0777); - printf("target_fd: %d, errno: %d %s\n", target_fd, errno, strerror(errno)); - } + { + int src_fd = open("file", O_CREAT | O_WRONLY, 0777); + close(src_fd); + } + { + int target_fd = mkdir("file/blah", 0777); + printf("target_fd: %d, errno: %d %s\n", target_fd, errno, strerror(errno)); + } } From af64dbaf8db4ae35c1f58fe1f691ef17337bb061 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 28 Nov 2024 13:01:01 +0100 Subject: [PATCH 09/11] Fix test_unistd_mkdir --- test/wasmfs/wasmfs_mkdir.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/wasmfs/wasmfs_mkdir.c b/test/wasmfs/wasmfs_mkdir.c index 174e3f9dcf618..830cdadfcd24b 100644 --- a/test/wasmfs/wasmfs_mkdir.c +++ b/test/wasmfs/wasmfs_mkdir.c @@ -81,13 +81,7 @@ int main() { // Try to make a directory with a path component that is not a directory. errno = 0; mkdir("/dev/stdout/fake-directory", 0777); - // TODO: This may have to change when access modes are implemented, depending - // on if we check access mode before file type. -#ifdef WASMFS assert(errno == ENOTDIR); -#else - assert(errno == EACCES); -#endif // Try to make a directory with a path component that does not exist. errno = 0; From b93816f016c406a404ed6c548146d345c9b11329 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 28 Nov 2024 14:09:11 +0100 Subject: [PATCH 10/11] retrigger ci From 349d1e8bed683c90cda19f4ead5ea55d78b3f54c Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 28 Nov 2024 15:23:22 +0100 Subject: [PATCH 11/11] retrigger ci