From cb9c17ddc18cb0e6211e86d8eeb9617c68715745 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sun, 19 Jun 2022 18:28:55 +0200 Subject: [PATCH] gh-84461: Fix Emscripten umask and permission issues (GH-94002) - Emscripten's default umask is too strict, see https://github.com/emscripten-core/emscripten/issues/17269 - getuid/getgid and geteuid/getegid are stubs that always return 0 (root). Disable effective uid/gid syscalls and fix tests that use chmod() current user. - Cannot drop X bit from directory. (cherry picked from commit 2702e408fd0e0dd7aec396b4cf8c7ce9caae81d8) --- Lib/test/libregrtest/main.py | 12 ++++++++++++ Lib/test/test_posix.py | 3 +++ Lib/test/test_pydoc.py | 1 + 3 files changed, 16 insertions(+) diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py index 85bf6e1d48e3a7..cc8ba05d39ca7d 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 eafb0a4977e371..e643d8e5a4ce63 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 82622762a41882..be224feca872ed 100644 --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -950,6 +950,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)