summaryrefslogtreecommitdiff
path: root/linuxthreads
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-11-04 21:11:41 +0000
committerUlrich Drepper <drepper@redhat.com>2003-11-04 21:11:41 +0000
commit9378784537d0a4cd4e630aa360d0ae838dfcf500 (patch)
treee1607d2c9565d13cc916214f1c4c9a603a0202d3 /linuxthreads
parent1c15327821aee947476284374a96c7ebb64dc0d6 (diff)
Update.
2003-11-04 Jakub Jelinek <jakub@redhat.com> * 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.
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/ChangeLog5
-rw-r--r--linuxthreads/signals.c15
2 files changed, 17 insertions, 3 deletions
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 <jakub@redhat.com>
+
+ * 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 <carlos@baldric.uwo.ca>
* 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. */