]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-47151: Fallback to fork when vfork fails in subprocess. (GH-32186)
authorGregory P. Smith <greg@krypto.org>
Thu, 31 Mar 2022 20:42:28 +0000 (13:42 -0700)
committerGitHub <noreply@github.com>
Thu, 31 Mar 2022 20:42:28 +0000 (13:42 -0700)
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.

Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst [new file with mode: 0644]
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 (file)
index 0000000..d4d0245
--- /dev/null
@@ -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.
index de599f8c970e38705cbb2b91c112e78301ccb137..440c7c5b3359941727b4bdac5e430885f3474a59 100644 (file)
@@ -685,6 +685,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
     {