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 8103b060d8)
This commit is contained in:
Jürgen Hötzel 2022-03-04 10:08:14 +01:00 committed by Robert Pluim
parent aab36e1895
commit 98abf01fd6

View file

@ -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;
}