[Python-checkins] [3.11] gh-84461: Fix Emscripten umask and permission issues (GH-94002) (GH-94006)

tiran webhook-mailer at python.org
Sun Jun 19 14:18:38 EDT 2022


https://github.com/python/cpython/commit/10731849184a3101ed18683b0128d689f1671c3f
commit: 10731849184a3101ed18683b0128d689f1671c3f
branch: 3.11
author: Christian Heimes <christian at python.org>
committer: tiran <christian at python.org>
date: 2022-06-19T20:18:34+02:00
summary:

[3.11] gh-84461: Fix Emscripten umask and permission issues (GH-94002) (GH-94006)

Co-authored-by: Christian Heimes <christian at python.org>

files:
M Lib/test/libregrtest/main.py
M Lib/test/test_posix.py
M Lib/test/test_pydoc.py
M Tools/wasm/config.site-wasm32-emscripten

diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py
index 85bf6e1d48e3a..cc8ba05d39ca7 100644
--- a/Lib/test/libregrtest/main.py
+++ b/Lib/test/libregrtest/main.py
@@ -600,6 +600,16 @@ def save_xml_result(self):
             for s in ET.tostringlist(root):
                 f.write(s)
 
+    def fix_umask(self):
+        if support.is_emscripten:
+            # Emscripten has default umask 0o777, which breaks some tests.
+            # see https://github.com/emscripten-core/emscripten/issues/17269
+            old_mask = os.umask(0)
+            if old_mask == 0o777:
+                os.umask(0o027)
+            else:
+                os.umask(old_mask)
+
     def set_temp_dir(self):
         if self.ns.tempdir:
             self.tmp_dir = self.ns.tempdir
@@ -660,6 +670,8 @@ def main(self, tests=None, **kwargs):
 
         self.set_temp_dir()
 
+        self.fix_umask()
+
         if self.ns.cleanup:
             self.cleanup()
             sys.exit(0)
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index 4130cdd0c022a..ae25ef55885dd 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -787,6 +787,7 @@ def check_stat(uid, gid):
             check_stat(uid, gid)
 
     @os_helper.skip_unless_working_chmod
+    @unittest.skipIf(support.is_emscripten, "getgid() is a stub")
     def test_chown(self):
         # raise an OSError if the file does not exist
         os.unlink(os_helper.TESTFN)
@@ -798,6 +799,7 @@ def test_chown(self):
 
     @os_helper.skip_unless_working_chmod
     @unittest.skipUnless(hasattr(posix, 'fchown'), "test needs os.fchown()")
+    @unittest.skipIf(support.is_emscripten, "getgid() is a stub")
     def test_fchown(self):
         os.unlink(os_helper.TESTFN)
 
@@ -1356,6 +1358,7 @@ def test_chmod_dir_fd(self):
 
     @unittest.skipUnless(hasattr(os, 'chown') and (os.chown in os.supports_dir_fd),
                          "test needs dir_fd support in os.chown()")
+    @unittest.skipIf(support.is_emscripten, "getgid() is a stub")
     def test_chown_dir_fd(self):
         with self.prepare_file() as (dir_fd, name, fullname):
             posix.chown(name, os.getuid(), os.getgid(), dir_fd=dir_fd)
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py
index b705b7aee8136..89faf0d9141f9 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -934,6 +934,7 @@ def test_apropos_with_unreadable_dir(self):
         self.assertEqual(err.getvalue(), '')
 
     @os_helper.skip_unless_working_chmod
+    @unittest.skipIf(is_emscripten, "cannot remove x bit")
     def test_apropos_empty_doc(self):
         pkgdir = os.path.join(TESTFN, 'walkpkg')
         os.mkdir(pkgdir)
diff --git a/Tools/wasm/config.site-wasm32-emscripten b/Tools/wasm/config.site-wasm32-emscripten
index 6420edcf54168..a31d60d05dd77 100644
--- a/Tools/wasm/config.site-wasm32-emscripten
+++ b/Tools/wasm/config.site-wasm32-emscripten
@@ -43,6 +43,13 @@ ac_cv_func_symlinkat=no
 ac_cv_func_lchmod=no
 ac_cv_func_lchown=no
 
+# geteuid / getegid are stubs and always return 0 (root). The stub breaks
+# code that assume effective user root has special permissions.
+ac_cv_func_geteuid=no
+ac_cv_func_getegid=no
+ac_cv_func_seteuid=no
+ac_cv_func_setegid=no
+
 # Syscalls not implemented in emscripten
 # [Errno 52] Function not implemented
 ac_cv_func_preadv2=no



More information about the Python-checkins mailing list