summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Heimes <christian@python.org>2022-04-01 19:20:56 (GMT)
committerGitHub <noreply@github.com>2022-04-01 19:20:56 (GMT)
commit082d3495d0c820972f09f6109a98ed7eb5a7b79f (patch)
treea18d8ff8a87bdc5ad7e6f106dd895c73cedc9556
parent76b8a075b8a79b08468fd0ed06a489a5c815bc11 (diff)
downloadcpython-082d3495d0c820972f09f6109a98ed7eb5a7b79f.zip
cpython-082d3495d0c820972f09f6109a98ed7eb5a7b79f.tar.gz
cpython-082d3495d0c820972f09f6109a98ed7eb5a7b79f.tar.bz2
bpo-40280: Emscripten fork_exec now fails early (GH-32224)
-rw-r--r--Lib/subprocess.py10
-rw-r--r--Lib/test/test_subprocess.py10
-rwxr-xr-xconfigure3
-rw-r--r--configure.ac3
4 files changed, 19 insertions, 7 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index ad08339..b58c578 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -96,7 +96,13 @@ if _mswindows:
"CREATE_NO_WINDOW", "DETACHED_PROCESS",
"CREATE_DEFAULT_ERROR_MODE", "CREATE_BREAKAWAY_FROM_JOB"])
else:
- import _posixsubprocess
+ if sys.platform in {"emscripten", "wasi"}:
+ def _fork_exec(*args, **kwargs):
+ raise OSError(
+ errno.ENOTSUP, f"{sys.platform} does not support processes."
+ )
+ else:
+ from _posixsubprocess import fork_exec as _fork_exec
import select
import selectors
@@ -1777,7 +1783,7 @@ class Popen:
for dir in os.get_exec_path(env))
fds_to_keep = set(pass_fds)
fds_to_keep.add(errpipe_write)
- self.pid = _posixsubprocess.fork_exec(
+ self.pid = _fork_exec(
args, executable_list,
close_fds, tuple(sorted(map(int, fds_to_keep))),
cwd, env_list,
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 99a25e2..8603b98 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -1805,7 +1805,7 @@ class POSIXProcessTestCase(BaseTestCase):
def __del__(self):
pass
- @mock.patch("subprocess._posixsubprocess.fork_exec")
+ @mock.patch("subprocess._fork_exec")
def test_exception_errpipe_normal(self, fork_exec):
"""Test error passing done through errpipe_write in the good case"""
def proper_error(*args):
@@ -1822,7 +1822,7 @@ class POSIXProcessTestCase(BaseTestCase):
with self.assertRaises(IsADirectoryError):
self.PopenNoDestructor(["non_existent_command"])
- @mock.patch("subprocess._posixsubprocess.fork_exec")
+ @mock.patch("subprocess._fork_exec")
def test_exception_errpipe_bad_data(self, fork_exec):
"""Test error passing done through errpipe_write where its not
in the expected format"""
@@ -2112,7 +2112,7 @@ class POSIXProcessTestCase(BaseTestCase):
preexec_fn=raise_it)
except subprocess.SubprocessError as e:
self.assertTrue(
- subprocess._posixsubprocess,
+ subprocess._fork_exec,
"Expected a ValueError from the preexec_fn")
except ValueError as e:
self.assertIn("coconut", e.args[0])
@@ -2600,11 +2600,11 @@ class POSIXProcessTestCase(BaseTestCase):
preexec_fn=prepare)
except ValueError as err:
# Pure Python implementations keeps the message
- self.assertIsNone(subprocess._posixsubprocess)
+ self.assertIsNone(subprocess._fork_exec)
self.assertEqual(str(err), "surrogate:\uDCff")
except subprocess.SubprocessError as err:
# _posixsubprocess uses a default message
- self.assertIsNotNone(subprocess._posixsubprocess)
+ self.assertIsNotNone(subprocess._fork_exec)
self.assertEqual(str(err), "Exception occurred in preexec_fn.")
else:
self.fail("Expected ValueError or subprocess.SubprocessError")
diff --git a/configure b/configure
index f08a01c..a5062d7 100755
--- a/configure
+++ b/configure
@@ -21772,6 +21772,9 @@ case $ac_sys_system/$ac_sys_emscripten_target in #(
py_cv_module__curses_panel=n/a
py_cv_module__dbm=n/a
py_cv_module__gdbm=n/a
+ py_cv_module__multiprocessing=n/a
+ py_cv_module__posixshmem=n/a
+ py_cv_module__posixsubprocess=n/a
py_cv_module__scproxy=n/a
py_cv_module__tkinter=n/a
py_cv_module__xxsubinterpreters=n/a
diff --git a/configure.ac b/configure.ac
index bc3d8b8..84bc9b3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6518,6 +6518,9 @@ AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
[_curses_panel],
[_dbm],
[_gdbm],
+ [_multiprocessing],
+ [_posixshmem],
+ [_posixsubprocess],
[_scproxy],
[_tkinter],
[_xxsubinterpreters],