summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index ec176a2..b2ce6a8 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -776,13 +776,15 @@ sigtimedwait(struct thread *td, struct sigtimedwait_args *uap)
error = kern_sigtimedwait(td, set, &info, timeout);
if (error)
return (error);
-
- error = copyout(&info, uap->info, sizeof(info));
+ if (uap->info)
+ error = copyout(&info, uap->info, sizeof(info));
/* Repost if we got an error. */
if (error && info.si_signo) {
PROC_LOCK(td->td_proc);
tdsignal(td, info.si_signo);
PROC_UNLOCK(td->td_proc);
+ } else {
+ td->td_retval[0] = info.si_signo;
}
return (error);
}
@@ -805,12 +807,15 @@ sigwaitinfo(struct thread *td, struct sigwaitinfo_args *uap)
if (error)
return (error);
- error = copyout(&info, uap->info, sizeof(info));
+ if (uap->info)
+ error = copyout(&info, uap->info, sizeof(info));
/* Repost if we got an error. */
if (error && info.si_signo) {
PROC_LOCK(td->td_proc);
tdsignal(td, info.si_signo);
PROC_UNLOCK(td->td_proc);
+ } else {
+ td->td_retval[0] = info.si_signo;
}
return (error);
}
@@ -834,7 +839,9 @@ kern_sigtimedwait(struct thread *td, sigset_t set, siginfo_t *info,
PROC_LOCK(p);
ps = p->p_sigacts;
oldmask = td->td_sigmask;
- td->td_sigmask = set;
+ SIGFILLSET(td->td_sigmask);
+ SIG_CANTMASK(td->td_sigmask);
+ SIGSETNAND(td->td_sigmask, set);
signotify(td);
mtx_lock(&ps->ps_mtx);
OpenPOWER on IntegriCloud