From 4a08c4c469d36f99d3a5e0f17ad82ab35dcf2835 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Thu, 31 Mar 2022 13:42:28 -0700 Subject: [PATCH] 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. --- .../next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst | 3 +++ Modules/_posixsubprocess.c | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2022-03-30-01-17-43.bpo-47151.z-nQkR.rst 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 00000000000000..d4d02459d35de1 --- /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 de599f8c970e38..440c7c5b335994 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -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 {