From 9378784537d0a4cd4e630aa360d0ae838dfcf500 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 4 Nov 2003 21:11:41 +0000 Subject: Update. 2003-11-04 Jakub Jelinek * io/ftw.c (ftw_dir): Close dir if callback with FTW_D type returns non-zero. * io/Makefile (tests): Add bug-ftw4. * io/bug-ftw4.c: New test. --- linuxthreads/ChangeLog | 5 +++++ linuxthreads/signals.c | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'linuxthreads') diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 3102111eff..8f74133fce 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,8 @@ +2003-11-04 Jakub Jelinek + + * signals.c (__pthread_sigaction): Set __sighandler[sig].old before + __libc_sigaction if it has been one of the special values before. + 2003-10-06 Carlos O'Donell * pthread.c (__pthread_self_stack): _STACK_GROWS_UP case added. diff --git a/linuxthreads/signals.c b/linuxthreads/signals.c index e1f67ab0e8..667754aa37 100644 --- a/linuxthreads/signals.c +++ b/linuxthreads/signals.c @@ -78,6 +78,7 @@ int __pthread_sigaction(int sig, const struct sigaction * act, { struct sigaction newact; struct sigaction *newactp; + __sighandler_t old = SIG_DFL; if (sig == __pthread_sig_restart || sig == __pthread_sig_cancel || @@ -86,6 +87,8 @@ int __pthread_sigaction(int sig, const struct sigaction * act, __set_errno (EINVAL); return -1; } + if (sig > 0 && sig < NSIG) + old = (__sighandler_t) __sighandler[sig].old; if (act) { newact = *act; @@ -96,21 +99,27 @@ int __pthread_sigaction(int sig, const struct sigaction * act, newact.sa_handler = (__sighandler_t) __pthread_sighandler_rt; else newact.sa_handler = (__sighandler_t) __pthread_sighandler; + if (old == SIG_IGN || old == SIG_DFL || old == SIG_ERR) + __sighandler[sig].old = (arch_sighandler_t) act->sa_handler; } newactp = &newact; } else newactp = NULL; if (__libc_sigaction(sig, newactp, oact) == -1) - return -1; + { + if (act) + __sighandler[sig].old = (arch_sighandler_t) old; + return -1; + } if (sig > 0 && sig < NSIG) { 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; + && old != SIG_ERR) + oact->sa_handler = old; if (act) /* For the assignment it does not matter whether it's a normal or real-time signal. */ -- cgit 1.4.1