summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2007-12-18 20:39:13 +0000
committerobrien <obrien@FreeBSD.org>2007-12-18 20:39:13 +0000
commitee337f2c349391c3e318ede0c5cff21592e02677 (patch)
tree794dd962ba52f7eaf97343fa100c8ce81314fc68 /sys/kern/kern_sig.c
parentff8db90dd7087915382193bcb6dfbc7cfedf32cc (diff)
downloadFreeBSD-src-ee337f2c349391c3e318ede0c5cff21592e02677.zip
FreeBSD-src-ee337f2c349391c3e318ede0c5cff21592e02677.tar.gz
Be more exact with sigaction SA_SIGINFO handling.
Reviewed by: marcel
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 239c420..24547a1 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -662,7 +662,6 @@ kern_sigaction(td, sig, act, oact, flags)
ps = p->p_sigacts;
mtx_lock(&ps->ps_mtx);
if (oact) {
- oact->sa_handler = ps->ps_sigact[_SIG_IDX(sig)];
oact->sa_mask = ps->ps_catchmask[_SIG_IDX(sig)];
oact->sa_flags = 0;
if (SIGISMEMBER(ps->ps_sigonstack, sig))
@@ -673,8 +672,12 @@ kern_sigaction(td, sig, act, oact, flags)
oact->sa_flags |= SA_RESETHAND;
if (SIGISMEMBER(ps->ps_signodefer, sig))
oact->sa_flags |= SA_NODEFER;
- if (SIGISMEMBER(ps->ps_siginfo, sig))
+ if (SIGISMEMBER(ps->ps_siginfo, sig)) {
oact->sa_flags |= SA_SIGINFO;
+ oact->sa_sigaction =
+ (__siginfohandler_t *)ps->ps_sigact[_SIG_IDX(sig)];
+ } else
+ oact->sa_handler = ps->ps_sigact[_SIG_IDX(sig)];
if (sig == SIGCHLD && ps->ps_flag & PS_NOCLDSTOP)
oact->sa_flags |= SA_NOCLDSTOP;
if (sig == SIGCHLD && ps->ps_flag & PS_NOCLDWAIT)
OpenPOWER on IntegriCloud