From 40d912b4658ac36049c089f1efe2db7d635f9ff8 Mon Sep 17 00:00:00 2001 From: davidxu Date: Sun, 14 Sep 2003 22:42:39 +0000 Subject: When invoking an old style signal handler, use true traditional BSD style to invoke signal handler. Reviewed by: deischen --- lib/libpthread/thread/thr_sig.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'lib/libpthread/thread/thr_sig.c') diff --git a/lib/libpthread/thread/thr_sig.c b/lib/libpthread/thread/thr_sig.c index cda46f1..1f1f0b4 100644 --- a/lib/libpthread/thread/thr_sig.c +++ b/lib/libpthread/thread/thr_sig.c @@ -299,6 +299,9 @@ sigprop(int sig) return (0); } +typedef void (*ohandler)(int sig, int code, + struct sigcontext *scp, char *addr, __sighandler_t *catcher); + void _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) { @@ -366,9 +369,11 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) (sigfunc != (__siginfohandler_t *)_thr_sig_handler)) { if ((sa_flags & SA_SIGINFO) != 0 || info == NULL) (*(sigfunc))(sig, info, ucp); - else - (*(sigfunc))(sig, (siginfo_t*)(intptr_t)info->si_code, - ucp); + else { + ((ohandler)(*sigfunc))( + sig, info->si_code, (struct sigcontext *)ucp, + info->si_addr, (__sighandler_t *)sigfunc); + } } else { if ((__sighandler_t *)sigfunc == SIG_DFL) { if (sigprop(sig) & SA_KILL) { @@ -444,9 +449,11 @@ thr_sig_invoke_handler(struct pthread *curthread, int sig, siginfo_t *info, ((__sighandler_t *)sigfunc != SIG_IGN)) { if ((sa_flags & SA_SIGINFO) != 0 || info == NULL) (*(sigfunc))(sig, info, ucp); - else - (*(sigfunc))(sig, (siginfo_t*)(intptr_t)info->si_code, - ucp); + else { + ((ohandler)(*sigfunc))( + sig, info->si_code, (struct sigcontext *)ucp, + info->si_addr, (__sighandler_t *)sigfunc); + } } else { if ((__sighandler_t *)sigfunc == SIG_DFL) { if (sigprop(sig) & SA_KILL) { -- cgit v1.1