From b7d046d7476b087b4275265b91c1101f37a40938 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:14:30 +0200 Subject: [PATCH 1/7] Set umask to 027 --- system/lib/libc/emscripten_syscall_stubs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c index c8eb79c02baf..4e257aa42d72 100644 --- a/system/lib/libc/emscripten_syscall_stubs.c +++ b/system/lib/libc/emscripten_syscall_stubs.c @@ -28,7 +28,7 @@ static int g_pid = 42; static int g_pgid = 42; static int g_ppid = 1; static int g_sid = 42; -static mode_t g_umask = S_IRWXU | S_IRWXG | S_IRWXO; +static mode_t g_umask = S_IWGRP | S_IRWXO; #ifdef NDEBUG #define REPORT(name) From a42e9e054e3b6a29d40c68cea1feb4355ed36f56 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:14:39 +0200 Subject: [PATCH 2/7] Add umask unit test --- test/stat/test_umask.c | 75 ++++++++++++++++++++++++++++++++++++++++++ test/test_core.py | 4 +++ 2 files changed, 79 insertions(+) create mode 100644 test/stat/test_umask.c diff --git a/test/stat/test_umask.c b/test/stat/test_umask.c new file mode 100644 index 000000000000..ebe9ac76a340 --- /dev/null +++ b/test/stat/test_umask.c @@ -0,0 +1,75 @@ +/* + * Copyright 2013 The Emscripten Authors. All rights reserved. + * Emscripten is available under two separate licenses, the MIT license and the + * University of Illinois/NCSA Open Source License. Both these licenses can be + * found in the LICENSE file. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +mode_t get_umask() { + mode_t current = umask(0); // Set umask to 0 and get the old value + umask(current); // Immediately set it back + return current; +} + +void create_file(const char *path, const char *buffer) { + mode_t mode = 0777 - get_umask(); + int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode); + assert(fd >= 0); + + int err = write(fd, buffer, sizeof(char) * strlen(buffer)); + assert(err == (sizeof(char) * strlen(buffer))); + + close(fd); +} + +void cleanup() { + unlink("umask_test_file"); +} + +void test() { + // Get the default umask + mode_t default_umask = get_umask(); + printf("default umask: %o\n", default_umask); + assert(default_umask == 027); + + // Create a new file with default umask + create_file("umask_test_file", "abcdef"); + struct stat st; + stat("umask_test_file", &st); + printf("default_umask - stat: %o\n", st.st_mode); + assert((st.st_mode & 0666) == 0640); + unlink("umask_test_file"); + + // Set new umask + mode_t new_umask = 022; + mode_t old_umask = umask(new_umask); + + // Create a new file with new umask + create_file("umask_test_file", "abcdef"); + stat("umask_test_file", &st); + printf("new_umask - stat: %o\n", st.st_mode); + assert((st.st_mode & 0666) == 0644); + + // Restore the old umask + umask(old_umask); + + puts("success"); +} + +int main() { + atexit(cleanup); + signal(SIGABRT, cleanup); + test(); + return EXIT_SUCCESS; +} diff --git a/test/test_core.py b/test/test_core.py index 838bd906c21c..f8da17efd228 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5609,6 +5609,10 @@ def test_statx(self): self.set_setting("FORCE_FILESYSTEM") self.do_runf('stat/test_statx.c', 'success') + def test_umask(self): + self.set_setting("FORCE_FILESYSTEM") + self.do_runf('stat/test_umask.c', 'success') + def test_fstatat(self): self.do_runf('stat/test_fstatat.c', 'success') From b0d7dcf9c6d0e9af51a15a80a6c1ccea6ce759f4 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:24:20 +0200 Subject: [PATCH 3/7] Move `test_umask` to core suite --- test/test_core.py | 4 ---- test/test_other.py | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_core.py b/test/test_core.py index f8da17efd228..838bd906c21c 100644 --- a/test/test_core.py +++ b/test/test_core.py @@ -5609,10 +5609,6 @@ def test_statx(self): self.set_setting("FORCE_FILESYSTEM") self.do_runf('stat/test_statx.c', 'success') - def test_umask(self): - self.set_setting("FORCE_FILESYSTEM") - self.do_runf('stat/test_umask.c', 'success') - def test_fstatat(self): self.do_runf('stat/test_fstatat.c', 'success') diff --git a/test/test_other.py b/test/test_other.py index 00a6ee7386d5..edd3f7f0dbf2 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -7673,6 +7673,10 @@ def test_umask_0(self): self.run_process([EMCC, 'src.c']) self.assertContained('hello, world!', self.run_js('a.out.js')) + def test_umask(self): + self.set_setting("FORCE_FILESYSTEM") + self.do_runf('stat/test_umask.c', 'success') + def test_no_missing_symbols(self): # simple hello world should not show any missing symbols self.run_process([EMCC, test_file('hello_world.c')]) From 1ff58dd48bae8b81b6c7212f9e49722ec9389e45 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:25:49 +0200 Subject: [PATCH 4/7] Remove `atexit` from test --- test/stat/test_umask.c | 1 - 1 file changed, 1 deletion(-) diff --git a/test/stat/test_umask.c b/test/stat/test_umask.c index ebe9ac76a340..f410e8ffdbf8 100644 --- a/test/stat/test_umask.c +++ b/test/stat/test_umask.c @@ -68,7 +68,6 @@ void test() { } int main() { - atexit(cleanup); signal(SIGABRT, cleanup); test(); return EXIT_SUCCESS; From 3d69a91c8e422ce3372b94017872b433939b9be3 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:25:56 +0200 Subject: [PATCH 5/7] Fix indentation --- test/stat/test_umask.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/stat/test_umask.c b/test/stat/test_umask.c index f410e8ffdbf8..8dec235d0b2e 100644 --- a/test/stat/test_umask.c +++ b/test/stat/test_umask.c @@ -17,9 +17,9 @@ #include mode_t get_umask() { - mode_t current = umask(0); // Set umask to 0 and get the old value - umask(current); // Immediately set it back - return current; + mode_t current = umask(0); // Set umask to 0 and get the old value + umask(current); // Immediately set it back + return current; } void create_file(const char *path, const char *buffer) { From 48487f1cadf4dfe0df8ace3633adf56086f4da69 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:26:07 +0200 Subject: [PATCH 6/7] Update year of copyright --- test/stat/test_umask.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/stat/test_umask.c b/test/stat/test_umask.c index 8dec235d0b2e..b43a1547efe8 100644 --- a/test/stat/test_umask.c +++ b/test/stat/test_umask.c @@ -1,5 +1,5 @@ /* - * Copyright 2013 The Emscripten Authors. All rights reserved. + * Copyright 2024 The Emscripten Authors. All rights reserved. * Emscripten is available under two separate licenses, the MIT license and the * University of Illinois/NCSA Open Source License. Both these licenses can be * found in the LICENSE file. From 75827a0e4478490e9f4dc04699ac3af968537411 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Date: Thu, 19 Sep 2024 19:33:07 +0200 Subject: [PATCH 7/7] Mark `test_umask` as `crossplatform` and to be tested with `wasmfs` --- test/test_other.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_other.py b/test/test_other.py index edd3f7f0dbf2..d6795e1159ae 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -7673,6 +7673,8 @@ def test_umask_0(self): self.run_process([EMCC, 'src.c']) self.assertContained('hello, world!', self.run_js('a.out.js')) + @crossplatform + @also_with_wasmfs def test_umask(self): self.set_setting("FORCE_FILESYSTEM") self.do_runf('stat/test_umask.c', 'success')