Misc #12439 ยป 0001-process.c-disable_child_handler_fork_child-simplify.patch
| process.c | ||
|---|---|---|
|
{
|
||
|
int sig;
|
||
|
int ret;
|
||
|
#ifdef POSIX_SIGNAL
|
||
|
struct sigaction act, oact;
|
||
|
act.sa_handler = SIG_DFL;
|
||
|
act.sa_flags = 0;
|
||
|
ret = sigemptyset(&act.sa_mask); /* async-signal-safe */
|
||
|
if (ret == -1) {
|
||
|
ERRMSG("sigemptyset");
|
||
|
return -1;
|
||
|
}
|
||
|
#else
|
||
|
sig_t handler;
|
||
|
#endif
|
||
|
for (sig = 1; sig < NSIG; sig++) {
|
||
|
int reset = 0;
|
||
|
#ifdef SIGPIPE
|
||
|
if (sig == SIGPIPE) {
|
||
|
reset = 1;
|
||
|
#ifndef POSIX_SIGNAL
|
||
|
handler = SIG_DFL;
|
||
|
#endif
|
||
|
}
|
||
|
#endif
|
||
|
if (!reset) {
|
||
|
#ifdef POSIX_SIGNAL
|
||
|
ret = sigaction(sig, NULL, &oact); /* async-signal-safe */
|
||
|
if (ret == -1 && errno == EINVAL) {
|
||
|
continue; /* Ignore invalid signal number. */
|
||
|
}
|
||
|
if (ret == -1) {
|
||
|
ERRMSG("sigaction to obtain old action");
|
||
|
return -1;
|
||
|
}
|
||
|
reset = (oact.sa_flags & SA_SIGINFO) ||
|
||
|
(oact.sa_handler != SIG_IGN && oact.sa_handler != SIG_DFL);
|
||
|
#else
|
||
|
handler = signal(sig, SIG_DFL);
|
||
|
sig_t handler = signal(sig, SIG_DFL);
|
||
|
if (handler == SIG_ERR && errno == EINVAL) {
|
||
|
continue; /* Ignore invalid signal number */
|
||
|
}
|
||
| ... | ... | |
|
ERRMSG("signal to obtain old action");
|
||
|
return -1;
|
||
|
}
|
||
|
reset = (handler != SIG_IGN && handler != SIG_DFL);
|
||
|
#endif
|
||
|
}
|
||
|
if (reset) {
|
||
|
#ifdef POSIX_SIGNAL
|
||
|
ret = sigaction(sig, &act, NULL); /* async-signal-safe */
|
||
|
if (ret == -1) {
|
||
|
ERRMSG("sigaction to set default action");
|
||
|
return -1;
|
||
|
#ifdef SIGPIPE
|
||
|
if (sig == SIGPIPE) {
|
||
|
continue;
|
||
|
}
|
||
|
#else
|
||
|
handler = signal(sig, handler);
|
||
|
if (handler == SIG_ERR) {
|
||
|
ERRMSG("signal to set default action");
|
||
|
return -1;
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
/* it will be reset to SIG_DFL at execve time, instead */
|
||
|
if (handler == SIG_IGN) {
|
||
|
signal(sig, SIG_IGN);
|
||
|
}
|
||
|
}
|
||
|
ret = sigprocmask(SIG_SETMASK, &old->sigmask, NULL); /* async-signal-safe */
|
||