Browse Source

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 <[email protected]>
Brad King 1 year ago
parent
commit
e3e2ef1964
1 changed files with 7 additions and 3 deletions
  1. 7 3
      Utilities/cmlibuv/src/unix/process.c

+ 7 - 3
Utilities/cmlibuv/src/unix/process.c

@@ -37,7 +37,11 @@
 #include <sched.h>
 
 #if defined(__APPLE__)
-# include <spawn.h>
+  /* 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 <spawn.h>
+# endif
 # include <paths.h>
 # include <sys/kauth.h>
 # include <sys/types.h>
@@ -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