diff options
author | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2017-11-22 21:30:24 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@uclibc-ng.org> | 2017-11-22 21:31:41 +0100 |
commit | 71b3a63b641716165f664cf112be0673a122cea0 (patch) | |
tree | e8350273c4889d1067e2eb4824dfaa0358604a6d /librt/spawn.c | |
parent | 2fcffe26e815b7125a357c83b59617ab93c16b41 (diff) |
librt: fix broken posix_spawn
Fix iteration over signals, synced with GNU C library code and
pending patches. Issues found when running dhcpcd with hook
scripts. (exit status 127)
Reported-By: kapeka <kapeka@bering-uclibc.de>
Diffstat (limited to 'librt/spawn.c')
-rw-r--r-- | librt/spawn.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/librt/spawn.c b/librt/spawn.c index 25e3994e1..a2b8e061b 100644 --- a/librt/spawn.c +++ b/librt/spawn.c @@ -25,6 +25,7 @@ #include <sys/resource.h> #include <not-cancel.h> +#include <internal-signals.h> #include <spawn.h> #include "spawn_int.h" @@ -153,13 +154,32 @@ __spawni(pid_t *pid, const char *file, int sig; memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_DFL; - for (sig = 1; sig <= _NSIG; ++sig) { - if (sigismember(&attrp->__sd, sig)) { - if (sigaction(sig, &sa, NULL) != 0) - goto error; - } + sigset_t hset; + sigprocmask (SIG_BLOCK, 0, &hset); + + for (int sig = 1; sig < _NSIG; ++sig) { + if ((flags & POSIX_SPAWN_SETSIGDEF) + && sigismember (&attrp->__sd, sig)) + { + sa.sa_handler = SIG_DFL; + } + else if (sigismember (&hset, sig)) + { + if (__is_internal_signal (sig)) + sa.sa_handler = SIG_IGN; + else + { + __libc_sigaction (sig, 0, &sa); + if (sa.sa_handler == SIG_IGN) + continue; + sa.sa_handler = SIG_DFL; + } + } + else + continue; + + __libc_sigaction (sig, &sa, 0); } } |