]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-127146: Emscripten: Make os.umask() actually work (GH-136706) (#136711)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 16 Jul 2025 16:12:36 +0000 (18:12 +0200)
committerGitHub <noreply@github.com>
Wed, 16 Jul 2025 16:12:36 +0000 (16:12 +0000)
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.
(cherry picked from commit 12e52cad718723636a96042f9399634392285c44)

Co-authored-by: Hood Chatham <roberthoodchatham@gmail.com>
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);
+}