From b7c39a19d6a0f1ab902fa1dcb3cb85de87b9b945 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 11 Dec 2024 21:32:02 +0100 Subject: [PATCH 1/7] Make open O_CREATE mode 0 work In nodefs we first create the node with permissions 0 and then try to open it. The open fails because we don't have read permissions. --- src/library_fs.js | 5 ++- test/fs/test_fs_open_no_permissions.c | 44 +++++++++++++++++++++++++++ test/test_core.py | 10 ++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 test/fs/test_fs_open_no_permissions.c diff --git a/src/library_fs.js b/src/library_fs.js index 68c53ad670bb5..7c149bfd61ccb 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -1076,7 +1076,7 @@ FS.staticInit(); } } else { // node doesn't exist, try to create it - node = FS.mknod(path, mode, 0); + node = FS.mknod(path, mode | 0o777, 0); created = true; } } @@ -1126,6 +1126,9 @@ FS.staticInit(); if (stream.stream_ops.open) { stream.stream_ops.open(stream); } + if (created) { + FS.chmod(node, mode & 0o777); + } #if expectToReceiveOnModule('logReadFiles') if (Module['logReadFiles'] && !(flags & {{{ cDefs.O_WRONLY}}})) { if (!(path in FS.readFiles)) { diff --git a/test/fs/test_fs_open_no_permissions.c b/test/fs/test_fs_open_no_permissions.c new file mode 100644 index 0000000000000..433d7c388b259 --- /dev/null +++ b/test/fs/test_fs_open_no_permissions.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#if defined(__EMSCRIPTEN__) +#include +#endif + +void makedir(const char *dir) { + int rtn = mkdir(dir, 0777); + assert(rtn == 0); +} + +void changedir(const char *dir) { + int rtn = chdir(dir); + assert(rtn == 0); +} + +void setup() { +#if defined(__EMSCRIPTEN__) && defined(NODEFS) + makedir("working"); + EM_ASM(FS.mount(NODEFS, { root: '.' }, 'working')); + changedir("working"); +#endif +} + +int main() { + setup(); + + int res = open("a", O_CREAT, 0); + printf("error: %s\n", strerror(errno)); + assert(res >= 0); + struct stat st; + assert(stat("a", &st) == 0); + assert((st.st_mode & 0777) == 0); + printf("success\n"); +} diff --git a/test/test_core.py b/test/test_core.py index d3fff94c5a8ec..e01a70593eb20 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5900,6 +5900,16 @@ def test_fs_rename_on_existing(self, args): self.set_setting('FORCE_FILESYSTEM') self.do_runf('fs/test_fs_rename_on_existing.c', 'success', emcc_args=args) + @parameterized({ + '': ([],), + 'nodefs': (['-DNODEFS', '-lnodefs.js'],), + 'noderawfs': (['-sNODERAWFS'],) + }) + def test_fs_open_no_permissions(self, args): + if self.get_setting('WASMFS'): + self.set_setting('FORCE_FILESYSTEM') + self.do_runf('fs/test_fs_open_no_permissions.c', 'success', emcc_args=args) + def test_sigalrm(self): self.do_runf('test_sigalrm.c', 'Received alarm!') self.set_setting('EXIT_RUNTIME') From 8c8d34ba66d9db728d7e8db2823ec3c37e102493 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Mon, 16 Dec 2024 11:44:49 +0100 Subject: [PATCH 2/7] Cleanup --- test/fs/test_fs_open_no_permissions.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/fs/test_fs_open_no_permissions.c b/test/fs/test_fs_open_no_permissions.c index 433d7c388b259..23781f4cc8cee 100644 --- a/test/fs/test_fs_open_no_permissions.c +++ b/test/fs/test_fs_open_no_permissions.c @@ -32,13 +32,13 @@ void setup() { } int main() { - setup(); - - int res = open("a", O_CREAT, 0); - printf("error: %s\n", strerror(errno)); - assert(res >= 0); - struct stat st; - assert(stat("a", &st) == 0); - assert((st.st_mode & 0777) == 0); - printf("success\n"); + setup(); + + int res = open("a", O_CREAT, 0); + printf("error: %s\n", strerror(errno)); + assert(res >= 0); + struct stat st; + assert(stat("a", &st) == 0); + assert((st.st_mode & 0777) == 0); + printf("success\n"); } From 2d716d19bdc0bb44837ccaa7e6d4cca220494220 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 18 Dec 2024 11:48:56 +0100 Subject: [PATCH 3/7] Cleanup --- test/fs/test_fs_open_no_permissions.c | 25 ------------------------- test/test_core.py | 12 +++--------- 2 files changed, 3 insertions(+), 34 deletions(-) diff --git a/test/fs/test_fs_open_no_permissions.c b/test/fs/test_fs_open_no_permissions.c index 23781f4cc8cee..a8d7eddc3b3b5 100644 --- a/test/fs/test_fs_open_no_permissions.c +++ b/test/fs/test_fs_open_no_permissions.c @@ -8,32 +8,7 @@ #include #include - -#if defined(__EMSCRIPTEN__) -#include -#endif - -void makedir(const char *dir) { - int rtn = mkdir(dir, 0777); - assert(rtn == 0); -} - -void changedir(const char *dir) { - int rtn = chdir(dir); - assert(rtn == 0); -} - -void setup() { -#if defined(__EMSCRIPTEN__) && defined(NODEFS) - makedir("working"); - EM_ASM(FS.mount(NODEFS, { root: '.' }, 'working')); - changedir("working"); -#endif -} - int main() { - setup(); - int res = open("a", O_CREAT, 0); printf("error: %s\n", strerror(errno)); assert(res >= 0); diff --git a/test/test_core.py b/test/test_core.py index f89a1253377fe..ffe08cc308dfc 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5858,15 +5858,9 @@ def test_fs_rename_on_existing(self): self.set_setting('FORCE_FILESYSTEM') self.do_runf('fs/test_fs_rename_on_existing.c', 'success') - @parameterized({ - '': ([],), - 'nodefs': (['-DNODEFS', '-lnodefs.js'],), - 'noderawfs': (['-sNODERAWFS'],) - }) - def test_fs_open_no_permissions(self, args): - if self.get_setting('WASMFS'): - self.set_setting('FORCE_FILESYSTEM') - self.do_runf('fs/test_fs_open_no_permissions.c', 'success', emcc_args=args) + @also_with_nodefs_both + def test_fs_open_no_permissions(self): + self.do_runf('fs/test_fs_open_no_permissions.c', 'success') def test_sigalrm(self): self.do_runf('test_sigalrm.c', 'Received alarm!') From d2db9c9f1df0df5eae7546ee20afe4c7638f35ed Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 18 Dec 2024 16:29:52 +0100 Subject: [PATCH 4/7] Add comment --- src/library_fs.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/library_fs.js b/src/library_fs.js index 7c149bfd61ccb..d54f1a2f84325 100644 --- a/src/library_fs.js +++ b/src/library_fs.js @@ -1076,6 +1076,9 @@ FS.staticInit(); } } else { // node doesn't exist, try to create it + // Ignore the permission bits here to ensure we can `open` this new + // file below. We use chmod below the apply the permissions once the + // file is open. node = FS.mknod(path, mode | 0o777, 0); created = true; } From 058214d8e25cab8d44394c556f6f89b1a5298d10 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 18 Dec 2024 20:47:28 +0100 Subject: [PATCH 5/7] Add TODO asking to merge fs_open_no_permissions with test_fcntl_open --- test/fs/test_fs_open_no_permissions.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/fs/test_fs_open_no_permissions.c b/test/fs/test_fs_open_no_permissions.c index a8d7eddc3b3b5..c1b647396009e 100644 --- a/test/fs/test_fs_open_no_permissions.c +++ b/test/fs/test_fs_open_no_permissions.c @@ -8,6 +8,8 @@ #include #include +// TODO: Combine this with test_fcntl_open.c. First requires fixing +// test_fcntl_open.c on noderawfs. int main() { int res = open("a", O_CREAT, 0); printf("error: %s\n", strerror(errno)); From 21dd7d8f9d33b1716c34d7ad071f3baf45fae2de Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Wed, 18 Dec 2024 22:05:37 +0100 Subject: [PATCH 6/7] Update code size --- test/other/codesize/test_codesize_minimal_esm.gzsize | 2 +- test/other/codesize/test_codesize_minimal_esm.jssize | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/other/codesize/test_codesize_minimal_esm.gzsize b/test/other/codesize/test_codesize_minimal_esm.gzsize index 50989ffea157c..84abd852d3092 100644 --- a/test/other/codesize/test_codesize_minimal_esm.gzsize +++ b/test/other/codesize/test_codesize_minimal_esm.gzsize @@ -1 +1 @@ -1400 +1487 diff --git a/test/other/codesize/test_codesize_minimal_esm.jssize b/test/other/codesize/test_codesize_minimal_esm.jssize index 9b860457fa607..1877dcdd8387c 100644 --- a/test/other/codesize/test_codesize_minimal_esm.jssize +++ b/test/other/codesize/test_codesize_minimal_esm.jssize @@ -1 +1 @@ -2865 +3095 From fee091e3093a18bbceffd4bd8db8464a24c5ee72 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Thu, 19 Dec 2024 10:58:58 +0100 Subject: [PATCH 7/7] Automatic rebaseline of codesize expectations. NFC This is an automatic change generated by tools/maint/rebaseline_tests.py. The following (18) test expectation files were updated by running the tests with `--rebaseline`: ``` other/codesize/test_codesize_cxx_ctors1.gzsize: 8351 => 8407 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_ctors1.jssize: 20343 => 20486 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_ctors2.gzsize: 8334 => 8390 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_ctors2.jssize: 20311 => 20454 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_except.gzsize: 9356 => 9411 [+55 bytes / +0.59%] other/codesize/test_codesize_cxx_except.jssize: 24112 => 24255 [+143 bytes / +0.59%] other/codesize/test_codesize_cxx_except_wasm.gzsize: 8321 => 8373 [+52 bytes / +0.62%] other/codesize/test_codesize_cxx_except_wasm.jssize: 20236 => 20379 [+143 bytes / +0.71%] other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize: 8321 => 8373 [+52 bytes / +0.62%] other/codesize/test_codesize_cxx_except_wasm_exnref.jssize: 20236 => 20379 [+143 bytes / +0.71%] other/codesize/test_codesize_cxx_lto.gzsize: 8347 => 8404 [+57 bytes / +0.68%] other/codesize/test_codesize_cxx_lto.jssize: 20367 => 20510 [+143 bytes / +0.70%] other/codesize/test_codesize_cxx_mangle.gzsize: 9359 => 9416 [+57 bytes / +0.61%] other/codesize/test_codesize_cxx_mangle.jssize: 24112 => 24255 [+143 bytes / +0.59%] other/codesize/test_codesize_cxx_noexcept.gzsize: 8351 => 8407 [+56 bytes / +0.67%] other/codesize/test_codesize_cxx_noexcept.jssize: 20343 => 20486 [+143 bytes / +0.70%] other/codesize/test_codesize_files_js_fs.gzsize: 7654 => 7702 [+48 bytes / +0.63%] other/codesize/test_codesize_files_js_fs.jssize: 18838 => 18980 [+142 bytes / +0.75%] Average change: +0.66% (+0.59% - +0.75%) ``` --- test/other/codesize/test_codesize_cxx_ctors1.gzsize | 2 +- test/other/codesize/test_codesize_cxx_ctors1.jssize | 2 +- test/other/codesize/test_codesize_cxx_ctors2.gzsize | 2 +- test/other/codesize/test_codesize_cxx_ctors2.jssize | 2 +- test/other/codesize/test_codesize_cxx_except.gzsize | 2 +- test/other/codesize/test_codesize_cxx_except.jssize | 2 +- test/other/codesize/test_codesize_cxx_except_wasm.gzsize | 2 +- test/other/codesize/test_codesize_cxx_except_wasm.jssize | 2 +- test/other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize | 2 +- test/other/codesize/test_codesize_cxx_except_wasm_exnref.jssize | 2 +- test/other/codesize/test_codesize_cxx_lto.gzsize | 2 +- test/other/codesize/test_codesize_cxx_lto.jssize | 2 +- test/other/codesize/test_codesize_cxx_mangle.gzsize | 2 +- test/other/codesize/test_codesize_cxx_mangle.jssize | 2 +- test/other/codesize/test_codesize_cxx_noexcept.gzsize | 2 +- test/other/codesize/test_codesize_cxx_noexcept.jssize | 2 +- test/other/codesize/test_codesize_files_js_fs.gzsize | 2 +- test/other/codesize/test_codesize_files_js_fs.jssize | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/test/other/codesize/test_codesize_cxx_ctors1.gzsize b/test/other/codesize/test_codesize_cxx_ctors1.gzsize index 7c05c8455e746..4be81cb9fb3af 100644 --- a/test/other/codesize/test_codesize_cxx_ctors1.gzsize +++ b/test/other/codesize/test_codesize_cxx_ctors1.gzsize @@ -1 +1 @@ -8351 +8407 diff --git a/test/other/codesize/test_codesize_cxx_ctors1.jssize b/test/other/codesize/test_codesize_cxx_ctors1.jssize index 82d8332d892e9..a20e18243e7cb 100644 --- a/test/other/codesize/test_codesize_cxx_ctors1.jssize +++ b/test/other/codesize/test_codesize_cxx_ctors1.jssize @@ -1 +1 @@ -20343 +20486 diff --git a/test/other/codesize/test_codesize_cxx_ctors2.gzsize b/test/other/codesize/test_codesize_cxx_ctors2.gzsize index e7f2f2aa09e70..a559385da7f91 100644 --- a/test/other/codesize/test_codesize_cxx_ctors2.gzsize +++ b/test/other/codesize/test_codesize_cxx_ctors2.gzsize @@ -1 +1 @@ -8334 +8390 diff --git a/test/other/codesize/test_codesize_cxx_ctors2.jssize b/test/other/codesize/test_codesize_cxx_ctors2.jssize index f8c47ad8dd2c0..0ca3697c3144a 100644 --- a/test/other/codesize/test_codesize_cxx_ctors2.jssize +++ b/test/other/codesize/test_codesize_cxx_ctors2.jssize @@ -1 +1 @@ -20311 +20454 diff --git a/test/other/codesize/test_codesize_cxx_except.gzsize b/test/other/codesize/test_codesize_cxx_except.gzsize index 26f242e26fb55..d2e5ea2910cc9 100644 --- a/test/other/codesize/test_codesize_cxx_except.gzsize +++ b/test/other/codesize/test_codesize_cxx_except.gzsize @@ -1 +1 @@ -9356 +9411 diff --git a/test/other/codesize/test_codesize_cxx_except.jssize b/test/other/codesize/test_codesize_cxx_except.jssize index c495dc33171d4..d80dc789e6880 100644 --- a/test/other/codesize/test_codesize_cxx_except.jssize +++ b/test/other/codesize/test_codesize_cxx_except.jssize @@ -1 +1 @@ -24112 +24255 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm.gzsize b/test/other/codesize/test_codesize_cxx_except_wasm.gzsize index f14ddc132870a..2a12540f0635f 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm.gzsize +++ b/test/other/codesize/test_codesize_cxx_except_wasm.gzsize @@ -1 +1 @@ -8321 +8373 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm.jssize b/test/other/codesize/test_codesize_cxx_except_wasm.jssize index 276f80508b53d..903c819cfe0ac 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm.jssize +++ b/test/other/codesize/test_codesize_cxx_except_wasm.jssize @@ -1 +1 @@ -20236 +20379 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize b/test/other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize index f14ddc132870a..2a12540f0635f 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize +++ b/test/other/codesize/test_codesize_cxx_except_wasm_exnref.gzsize @@ -1 +1 @@ -8321 +8373 diff --git a/test/other/codesize/test_codesize_cxx_except_wasm_exnref.jssize b/test/other/codesize/test_codesize_cxx_except_wasm_exnref.jssize index 276f80508b53d..903c819cfe0ac 100644 --- a/test/other/codesize/test_codesize_cxx_except_wasm_exnref.jssize +++ b/test/other/codesize/test_codesize_cxx_except_wasm_exnref.jssize @@ -1 +1 @@ -20236 +20379 diff --git a/test/other/codesize/test_codesize_cxx_lto.gzsize b/test/other/codesize/test_codesize_cxx_lto.gzsize index a665dbc2e401e..5f41444ba9dcc 100644 --- a/test/other/codesize/test_codesize_cxx_lto.gzsize +++ b/test/other/codesize/test_codesize_cxx_lto.gzsize @@ -1 +1 @@ -8347 +8404 diff --git a/test/other/codesize/test_codesize_cxx_lto.jssize b/test/other/codesize/test_codesize_cxx_lto.jssize index cd0660982b7d0..c7e497cb94f12 100644 --- a/test/other/codesize/test_codesize_cxx_lto.jssize +++ b/test/other/codesize/test_codesize_cxx_lto.jssize @@ -1 +1 @@ -20367 +20510 diff --git a/test/other/codesize/test_codesize_cxx_mangle.gzsize b/test/other/codesize/test_codesize_cxx_mangle.gzsize index 886a28e6c91b7..54e18a6e2baed 100644 --- a/test/other/codesize/test_codesize_cxx_mangle.gzsize +++ b/test/other/codesize/test_codesize_cxx_mangle.gzsize @@ -1 +1 @@ -9359 +9416 diff --git a/test/other/codesize/test_codesize_cxx_mangle.jssize b/test/other/codesize/test_codesize_cxx_mangle.jssize index c495dc33171d4..d80dc789e6880 100644 --- a/test/other/codesize/test_codesize_cxx_mangle.jssize +++ b/test/other/codesize/test_codesize_cxx_mangle.jssize @@ -1 +1 @@ -24112 +24255 diff --git a/test/other/codesize/test_codesize_cxx_noexcept.gzsize b/test/other/codesize/test_codesize_cxx_noexcept.gzsize index 7c05c8455e746..4be81cb9fb3af 100644 --- a/test/other/codesize/test_codesize_cxx_noexcept.gzsize +++ b/test/other/codesize/test_codesize_cxx_noexcept.gzsize @@ -1 +1 @@ -8351 +8407 diff --git a/test/other/codesize/test_codesize_cxx_noexcept.jssize b/test/other/codesize/test_codesize_cxx_noexcept.jssize index 82d8332d892e9..a20e18243e7cb 100644 --- a/test/other/codesize/test_codesize_cxx_noexcept.jssize +++ b/test/other/codesize/test_codesize_cxx_noexcept.jssize @@ -1 +1 @@ -20343 +20486 diff --git a/test/other/codesize/test_codesize_files_js_fs.gzsize b/test/other/codesize/test_codesize_files_js_fs.gzsize index 309e97c7a9f6c..c3a0b57749871 100644 --- a/test/other/codesize/test_codesize_files_js_fs.gzsize +++ b/test/other/codesize/test_codesize_files_js_fs.gzsize @@ -1 +1 @@ -7654 +7702 diff --git a/test/other/codesize/test_codesize_files_js_fs.jssize b/test/other/codesize/test_codesize_files_js_fs.jssize index 79d0a5b02487f..33dab3f6f464f 100644 --- a/test/other/codesize/test_codesize_files_js_fs.jssize +++ b/test/other/codesize/test_codesize_files_js_fs.jssize @@ -1 +1 @@ -18838 +18980