From e3e2ef19645d8e6b9da3309bedff7ab3d13ee605 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 25 Mar 2024 12:00:25 -0400 Subject: libuv: Avoid posix_spawn on macOS < 10.8 Since libuv commit `83efa3dd71` (Reland "macos: use posix_spawn instead of fork", 2022-03-02, v1.44.0~10), `uv_spawn` on macOS < 10.8 has been observed to cause kernel panics and/or resource exhaustion. This became particularly noticeable in CMake since commit 5420639a8d (cmExecuteProcessCommand: Replace cmsysProcess with cmUVProcessChain, 2023-06-01, v3.28.0-rc1~138^2~8). Prefer `fork` over `posix_spawn` in libuv when targeting macOS < 10.8. Fixes: #25414 Fixes: #25818 Inspired-by: Ken Cunningham --- Utilities/cmlibuv/src/unix/process.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Utilities/cmlibuv/src/unix/process.c b/Utilities/cmlibuv/src/unix/process.c index 39ec451..5c39da6 100644 --- a/Utilities/cmlibuv/src/unix/process.c +++ b/Utilities/cmlibuv/src/unix/process.c @@ -37,7 +37,11 @@ #include #if defined(__APPLE__) -# include + /* macOS 10.8 and later have a working posix_spawn */ +# if MAC_OS_X_VERSION_MIN_REQUIRED >= 1080 +# define UV_USE_APPLE_POSIX_SPAWN +# include +# endif # include # include # include @@ -430,7 +434,7 @@ static void uv__process_child_init(const uv_process_options_t* options, #endif -#if defined(__APPLE__) +#if defined(UV_USE_APPLE_POSIX_SPAWN) typedef struct uv__posix_spawn_fncs_tag { struct { int (*addchdir_np)(const posix_spawn_file_actions_t *, const char *); @@ -882,7 +886,7 @@ static int uv__spawn_and_init_child( int exec_errorno; ssize_t r; -#if defined(__APPLE__) +#if defined(UV_USE_APPLE_POSIX_SPAWN) uv_once(&posix_spawn_init_once, uv__spawn_init_posix_spawn); /* Special child process spawn case for macOS Big Sur (11.0) onwards -- cgit v0.12