This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi! The following patch seems to fix testcase in http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=108634 That test doesn't use any threads, yet segfaults when linked with LT -lpthread and doesn't when linked only against -lc. Still, weird thing can happen if two sigaction calls are called at once in different threads, but that was never atomic in LT. 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. --- libc/linuxthreads/signals.c.jj 2003-01-07 01:09:22.000000000 +0100 +++ libc/linuxthreads/signals.c 2003-10-31 23:44:48.000000000 +0100 @@ -78,6 +78,7 @@ int __pthread_sigaction(int sig, const s { 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 s __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 s 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. */ Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |