summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-06-19 16:28:55 (GMT)
committerGitHub <noreply@github.com>2022-06-19 16:28:55 (GMT)
commit2702e408fd0e0dd7aec396b4cf8c7ce9caae81d8 (patch)
treef3c5b2459a940b3b67e0059b7a2ed936cb6f5cf0
parent476d30250811e185615dfb971c6a810cac2093bd (diff)
downloadcpython-2702e408fd0e0dd7aec396b4cf8c7ce9caae81d8.zip
cpython-2702e408fd0e0dd7aec396b4cf8c7ce9caae81d8.tar.gz
cpython-2702e408fd0e0dd7aec396b4cf8c7ce9caae81d8.tar.bz2
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.
-rw-r--r--Lib/test/libregrtest/main.py12
-rw-r--r--Lib/test/test_posix.py3
-rw-r--r--Lib/test/test_pydoc.py1
-rw-r--r--Tools/wasm/config.site-wasm32-emscripten7
4 files changed, 23 insertions, 0 deletions
diff --git a/Lib/test/libregrtest/main.py b/Lib/test/libregrtest/main.py
index 85bf6e1..cc8ba05 100644
--- a/Lib/test/libregrtest/main.py
+++ b/Lib/test/libregrtest/main.py
@@ -600,6 +600,16 @@ class Regrtest:
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 @@ class Regrtest:
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 4130cdd..ae25ef5 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -787,6 +787,7 @@ class PosixTester(unittest.TestCase):
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 @@ class PosixTester(unittest.TestCase):
@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 @@ class TestPosixDirFd(unittest.TestCase):
@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 b705b7a..89faf0d 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -934,6 +934,7 @@ class PydocImportTest(PydocBaseTest):
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 6420edc..a31d60d 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