(sighandler): Initialize all elements to SIG_ERR. (__sigaction): Don't use value from sighandler if it is SIG_ERR.

This commit is contained in:
Ulrich Drepper 2002-01-12 01:36:35 +00:00
parent 6c69f24aa8
commit db298de5c5

View File

@ -74,7 +74,7 @@ static union
{ {
arch_sighandler_t old; arch_sighandler_t old;
void (*rt) (int, struct siginfo *, struct ucontext *); void (*rt) (int, struct siginfo *, struct ucontext *);
} sighandler[NSIG]; } sighandler[NSIG] = { [1 ... NSIG - 1] = { (arch_sighandler_t) SIG_ERR } };
/* The wrapper around user-provided signal handlers */ /* The wrapper around user-provided signal handlers */
static void pthread_sighandler(int signo, SIGCONTEXT ctx) static void pthread_sighandler(int signo, SIGCONTEXT ctx)
@ -157,10 +157,14 @@ int __sigaction(int sig, const struct sigaction * act,
return -1; return -1;
if (sig > 0 && sig < NSIG) if (sig > 0 && sig < NSIG)
{ {
if (oact != NULL) if (oact != NULL
/* We may have inherited SIG_IGN from the parent, so return the
kernel's idea of the signal handler the first time
through. */
&& (__sighandler_t) sighandler[sig].old != SIG_ERR)
oact->sa_handler = (__sighandler_t) sighandler[sig].old; oact->sa_handler = (__sighandler_t) sighandler[sig].old;
if (act) if (act)
/* For the assignment is does not matter whether it's a normal /* For the assignment it does not matter whether it's a normal
or real-time signal. */ or real-time signal. */
sighandler[sig].old = (arch_sighandler_t) act->sa_handler; sighandler[sig].old = (arch_sighandler_t) act->sa_handler;
} }