From: Jürgen Hötzel Date: Fri, 4 Mar 2022 09:08:14 +0000 (+0100) Subject: Use correct signal oldset in posix_spawn implementation X-Git-Tag: emacs-28.1.90~155 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=98abf01fd681931f8870569ff559b547579d7cef;p=emacs.git Use correct signal oldset in posix_spawn implementation posix_spawn was restoring the wrong signal set, which still had SIGCHLD and SIGINT masked, causing problems with child processes that spawned child processes. (Bug#54667) See the thread ending at https://lists.gnu.org/archive/html/emacs-devel/2022-03/msg00067.html for more details. * src/callproc.c (emacs_spawn): Pass oldset parameter. (emacs_posix_spawn_init_attributes): Use correct oldset. (emacs_posix_spawn_init): Remove intermediate function. (cherry picked from commit 8103b060d89ac63a12c439087bd46c30da72cd97) --- diff --git a/src/callproc.c b/src/callproc.c index 66a35d9f33b..07eeadb3aa9 100644 --- a/src/callproc.c +++ b/src/callproc.c @@ -1335,7 +1335,8 @@ emacs_posix_spawn_init_actions (posix_spawn_file_actions_t *actions, } static int -emacs_posix_spawn_init_attributes (posix_spawnattr_t *attributes) +emacs_posix_spawn_init_attributes (posix_spawnattr_t *attributes, + const sigset_t *oldset) { int error = posix_spawnattr_init (attributes); if (error != 0) @@ -1377,11 +1378,7 @@ emacs_posix_spawn_init_attributes (posix_spawnattr_t *attributes) goto out; /* Stop blocking SIGCHLD in the child. */ - sigset_t oldset; - error = pthread_sigmask (SIG_SETMASK, NULL, &oldset); - if (error != 0) - goto out; - error = posix_spawnattr_setsigmask (attributes, &oldset); + error = posix_spawnattr_setsigmask (attributes, oldset); if (error != 0) goto out; @@ -1392,23 +1389,6 @@ emacs_posix_spawn_init_attributes (posix_spawnattr_t *attributes) return error; } -static int -emacs_posix_spawn_init (posix_spawn_file_actions_t *actions, - posix_spawnattr_t *attributes, int std_in, - int std_out, int std_err, const char *cwd) -{ - int error = emacs_posix_spawn_init_actions (actions, std_in, - std_out, std_err, cwd); - if (error != 0) - return error; - - error = emacs_posix_spawn_init_attributes (attributes); - if (error != 0) - return error; - - return 0; -} - #endif /* Start a new asynchronous subprocess. If successful, return zero @@ -1443,9 +1423,12 @@ emacs_spawn (pid_t *newpid, int std_in, int std_out, int std_err, if (use_posix_spawn) { /* Initialize optional attributes before blocking. */ - int error - = emacs_posix_spawn_init (&actions, &attributes, std_in, - std_out, std_err, cwd); + int error = emacs_posix_spawn_init_actions (&actions, std_in, + std_out, std_err, cwd); + if (error != 0) + return error; + + error = emacs_posix_spawn_init_attributes (&attributes, oldset); if (error != 0) return error; }