Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-40280: Block more non-working syscalls in Emscripten (GH-31757) #31757

Merged
merged 1 commit into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/distutils/tests/test_file_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ def test_move_file_exception_unpacking_unlink(self):
fobj.write('spam eggs')
move_file(self.source, self.target, verbose=0)

@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
def test_copy_file_hard_link(self):
with open(self.source, 'w') as f:
f.write('some content')
Expand All @@ -99,6 +100,7 @@ def test_copy_file_hard_link(self):
with open(self.source, 'r') as f:
self.assertEqual(f.read(), 'some content')

@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
def test_copy_file_hard_link_failure(self):
# If hard linking fails, copy_file() falls back on copying file
# (some special filesystems don't support hard linking even under
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/support/os_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
'encoding (%s). Unicode filename tests may not be effective'
% (TESTFN_UNENCODABLE, sys.getfilesystemencoding()))
TESTFN_UNENCODABLE = None
# Mac OS X denies unencodable filenames (invalid utf-8)
elif sys.platform != 'darwin':
# macOS and Emscripten deny unencodable filenames (invalid utf-8)
elif sys.platform not in {'darwin', 'emscripten'}:
try:
# ascii and utf-8 cannot encode the byte 0xff
b'\xff'.decode(sys.getfilesystemencoding())
Expand Down
4 changes: 4 additions & 0 deletions Lib/test/test_compileall.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ def test_compile_one_worker(self, compile_file_mock, pool_mock):
self.assertFalse(pool_mock.called)
self.assertTrue(compile_file_mock.called)

@skipUnless(_have_multiprocessing, "requires multiprocessing")
@mock.patch('concurrent.futures.ProcessPoolExecutor', new=None)
@mock.patch('compileall.compile_file')
def test_compile_missing_multiprocessing(self, compile_file_mock):
Expand Down Expand Up @@ -296,6 +297,7 @@ def test_ddir_only_one_worker(self):
"""Recursive compile_dir ddir= contains package paths; bpo39769."""
return self._test_ddir_only(ddir="<a prefix>", parallel=False)

@skipUnless(_have_multiprocessing, "requires multiprocessing")
def test_ddir_multiple_workers(self):
"""Recursive compile_dir ddir= contains package paths; bpo39769."""
return self._test_ddir_only(ddir="<a prefix>", parallel=True)
Expand All @@ -304,6 +306,7 @@ def test_ddir_empty_only_one_worker(self):
"""Recursive compile_dir ddir='' contains package paths; bpo39769."""
return self._test_ddir_only(ddir="", parallel=False)

@skipUnless(_have_multiprocessing, "requires multiprocessing")
def test_ddir_empty_multiple_workers(self):
"""Recursive compile_dir ddir='' contains package paths; bpo39769."""
return self._test_ddir_only(ddir="", parallel=True)
Expand Down Expand Up @@ -924,6 +927,7 @@ class CommandLineTestsNoSourceEpoch(CommandLineTestsBase,



@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
class HardlinkDedupTestsBase:
# Test hardlink_dupes parameter of compileall.compile_dir()

Expand Down
10 changes: 7 additions & 3 deletions Lib/test/test_genericpath.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import sys
import unittest
import warnings
from test.support import is_emscripten
from test.support import os_helper
from test.support import warnings_helper
from test.support.script_helper import assert_python_ok
Expand Down Expand Up @@ -154,6 +155,7 @@ def test_exists(self):
self.assertIs(self.pathmodule.lexists(bfilename + b'\x00'), False)

@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
@unittest.skipIf(is_emscripten, "Emscripten pipe fds have no stat")
def test_exists_fd(self):
r, w = os.pipe()
try:
Expand Down Expand Up @@ -246,6 +248,7 @@ def _test_samefile_on_link_func(self, func):
def test_samefile_on_symlink(self):
self._test_samefile_on_link_func(os.symlink)

@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
def test_samefile_on_link(self):
try:
self._test_samefile_on_link_func(os.link)
Expand Down Expand Up @@ -288,6 +291,7 @@ def _test_samestat_on_link_func(self, func):
def test_samestat_on_symlink(self):
self._test_samestat_on_link_func(os.symlink)

@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
def test_samestat_on_link(self):
try:
self._test_samestat_on_link_func(os.link)
Expand Down Expand Up @@ -476,11 +480,11 @@ def test_abspath_issue3426(self):

def test_nonascii_abspath(self):
if (os_helper.TESTFN_UNDECODABLE
# Mac OS X denies the creation of a directory with an invalid
# UTF-8 name. Windows allows creating a directory with an
# macOS and Emscripten deny the creation of a directory with an
# invalid UTF-8 name. Windows allows creating a directory with an
# arbitrary bytes name, but fails to enter this directory
# (when the bytes name is used).
and sys.platform not in ('win32', 'darwin')):
and sys.platform not in ('win32', 'darwin', 'emscripten')):
name = os_helper.TESTFN_UNDECODABLE
elif os_helper.TESTFN_NONASCII:
name = os_helper.TESTFN_NONASCII
Expand Down
1 change: 1 addition & 0 deletions Lib/test/test_os.py
Original file line number Diff line number Diff line change
Expand Up @@ -2203,6 +2203,7 @@ def test_blocking(self):
self.check(os.set_blocking, True)


@unittest.skipUnless(hasattr(os, 'link'), 'requires os.link')
class LinkTests(unittest.TestCase):
def setUp(self):
self.file1 = os_helper.TESTFN
Expand Down
10 changes: 7 additions & 3 deletions Lib/test/test_posix.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ def testNoArgFunctions(self):
for name in NO_ARG_FUNCTIONS:
posix_func = getattr(posix, name, None)
if posix_func is not None:
posix_func()
self.assertRaises(TypeError, posix_func, 1)
with self.subTest(name):
posix_func()
self.assertRaises(TypeError, posix_func, 1)

@unittest.skipUnless(hasattr(posix, 'getresuid'),
'test needs posix.getresuid()')
Expand Down Expand Up @@ -1399,7 +1400,10 @@ def test_utime_dir_fd(self):
# whoops! using both together not supported on this platform.
pass

@unittest.skipUnless(os.link in os.supports_dir_fd, "test needs dir_fd support in os.link()")
@unittest.skipUnless(
hasattr(os, "link") and os.link in os.supports_dir_fd,
"test needs dir_fd support in os.link()"
)
def test_link_dir_fd(self):
with self.prepare_file() as (dir_fd, name, fullname), \
self.prepare() as (dir_fd2, linkname, fulllinkname):
Expand Down
3 changes: 2 additions & 1 deletion Lib/test/test_script_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import subprocess
import sys
import os
from test.support import script_helper
from test.support import script_helper, requires_subprocess
import unittest
from unittest import mock

Expand Down Expand Up @@ -69,6 +69,7 @@ def test_assert_python_not_isolated_when_env_is_required(self, mock_popen):
self.assertNotIn('-E', popen_command)


@requires_subprocess()
class TestScriptHelperEnvironment(unittest.TestCase):
"""Code coverage for interpreter_requires_environment()."""

Expand Down
13 changes: 12 additions & 1 deletion Tools/wasm/config.site-wasm32-emscripten
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,22 @@ ac_cv_func_mkfifoat=no
ac_cv_func_mknod=no
ac_cv_func_mknodat=no

# always fails with permission error
# always fails with permission or not implemented error
ac_cv_func_getgroups=no
ac_cv_func_setgroups=no
ac_cv_func_setresuid=no
ac_cv_func_setresgid=no

# Emscripten geteuid() / getegid() always return 0 (root), which breaks
# assumption in tarfile module and some tests.
ac_cv_func_getegid=no
ac_cv_func_geteuid=no

# Emscripten does not support hard links, always fails with errno 34
# "Too many links". See emscripten_syscall_stubs.c
ac_cv_func_link=no
ac_cv_func_linkat=no

# alarm signal is not delivered, may need a callback into the event loop?
ac_cv_func_alarm=no

Expand Down