]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127146: Emscripten: Make os.umask() actually work (#136706)
authorHood Chatham <roberthoodchatham@gmail.com>
Wed, 16 Jul 2025 13:33:15 +0000 (15:33 +0200)
committerGitHub <noreply@github.com>
Wed, 16 Jul 2025 13:33:15 +0000 (15:33 +0200)
Provide a stub implementation of umask that is enough to get some tests passing.
More work is needed upstream in Emscripten to make all umask tests to pass.

Lib/test/test_os.py
Python/emscripten_syscalls.c

index 1e50dc43c35f5c01f08c837fac582bea2c1ae5c2..de3a17fe893170aa6388be6884154352940ca19e 100644 (file)
@@ -1918,11 +1918,9 @@ class MakedirTests(unittest.TestCase):
         support.is_wasi,
         "WASI's umask is a stub."
     )
-    @unittest.skipIf(
-        support.is_emscripten,
-        "TODO: Fails in buildbot; see #135783"
-    )
     def test_mode(self):
+        # Note: in some cases, the umask might already be 2 in which case this
+        # will pass even if os.umask is actually broken.
         with os_helper.temp_umask(0o002):
             base = os_helper.TESTFN
             parent = os.path.join(base, 'dir1')
index 7875bfc8fe56ae18e75cc166a80a3610c941c052..bb80f979420ec12dfb9a7209eea21a2c87a811b2 100644 (file)
@@ -7,7 +7,7 @@
 // defined with weak linkage so we can override it.
 EM_JS(int, __syscall_getuid32_js, (void), {
     // If we're in node and we can, report the native uid
-    if (typeof process !== "undefined" && typeof process.getuid === "function") {
+    if (ENVIRONMENT_IS_NODE) {
         return process.getuid();
     }
     // Fall back to the stub case of returning 0.
@@ -17,3 +17,23 @@ EM_JS(int, __syscall_getuid32_js, (void), {
 int __syscall_getuid32(void) {
     return __syscall_getuid32_js();
 }
+
+EM_JS(int, __syscall_umask_js, (int mask), {
+    // If we're in node and we can, call native process.umask()
+    if (ENVIRONMENT_IS_NODE) {
+        try {
+            return process.umask(mask);
+        } catch(e) {
+            // oops...
+            // NodeJS docs: "In Worker threads, process.umask(mask) will throw an exception."
+            // umask docs: "This system call always succeeds"
+            return 0;
+        }
+    }
+    // Fall back to the stub case of returning 0.
+    return 0;
+})
+
+int __syscall_umask(int mask) {
+    return __syscall_umask_js(mask);
+}