]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40280: Emscripten fork_exec now fails early (GH-32224)
authorChristian Heimes <christian@python.org>
Fri, 1 Apr 2022 19:20:56 +0000 (22:20 +0300)
committerGitHub <noreply@github.com>
Fri, 1 Apr 2022 19:20:56 +0000 (21:20 +0200)
Lib/subprocess.py
Lib/test/test_subprocess.py
configure
configure.ac

index ad08339b25ddc37a7073a54366bfff8c7b239078..b58c5784283902eea5a92c0dfe22aa18b57abe38 100644 (file)
@@ -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,
index 99a25e279df92c087a052f2c8223fcc305ebd170..8603b9888bb98468dbd31a5c1568026a7ebce15e 100644 (file)
@@ -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")
index f08a01caafdd5e57e1848fb1f273c29c17b5b41f..a5062d7b81573732b6de9657f7f1f16ca412b73d 100755 (executable)
--- 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
index bc3d8b87def9c567f9374665aaae95b33dae535f..84bc9b3ca5cf04fb44e1868a6995dc1a4b35cfca 100644 (file)
@@ -6518,6 +6518,9 @@ AS_CASE([$ac_sys_system/$ac_sys_emscripten_target],
       [_curses_panel],
       [_dbm],
       [_gdbm],
+      [_multiprocessing],
+      [_posixshmem],
+      [_posixsubprocess],
       [_scproxy],
       [_tkinter],
       [_xxsubinterpreters],