[Python-checkins] bpo-47151: Fallback to fork when vfork fails in subprocess. (GH-32186)

miss-islington webhook-mailer at python.org
Thu Mar 31 17:09:59 EDT 2022


https://github.com/python/cpython/commit/9ed179b07df6ce7432f972f5d069a7c8dee56e79
commit: 9ed179b07df6ce7432f972f5d069a7c8dee56e79
branch: 3.10
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-03-31T14:09:50-07:00
summary:

bpo-47151: Fallback to fork when vfork fails in subprocess. (GH-32186)


bpo-47151: Fallback to fork when vfork fails in subprocess. An OS kernel can specifically decide to disallow vfork() in a process. No need for that to prevent us from launching subprocesses.
(cherry picked from commit 4a08c4c469d36f99d3a5e0f17ad82ab35dcf2835)

Co-authored-by: Gregory P. Smith <greg at krypto.org>

files:
A Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst
M Modules/_posixsubprocess.c

diff --git a/Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst b/Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst
new file mode 100644
index 0000000000000..d4d02459d35de
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst
@@ -0,0 +1,3 @@
+When subprocess tries to use vfork, it now falls back to fork if vfork
+returns an error. This allows use in situations where vfork isn't allowed
+by the OS kernel.
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index a58159a277bea..18a81c6ed8b35 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -681,6 +681,12 @@ do_fork_exec(char *const exec_array[],
         assert(preexec_fn == Py_None);
 
         pid = vfork();
+        if (pid == -1) {
+            /* If vfork() fails, fall back to using fork(). When it isn't
+             * allowed in a process by the kernel, vfork can return -1
+             * with errno EINVAL. https://bugs.python.org/issue47151. */
+            pid = fork();
+        }
     } else
 #endif
     {



More information about the Python-checkins mailing list