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.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 5bdcfcc2bf2..f7c01ad4fe5 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.112 2010/06/29 20:48:50 guenther Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.113 2010/06/30 01:47:35 tedu Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -219,16 +219,21 @@ sys_sigaction(struct proc *p, void *v, register_t *retval)
} */ *uap = v;
struct sigaction vec;
struct sigaction *sa;
+ const struct sigaction *nsa;
+ struct sigaction *osa;
struct sigacts *ps = p->p_sigacts;
int signum;
int bit, error;
signum = SCARG(uap, signum);
+ nsa = SCARG(uap, nsa);
+ osa = SCARG(uap, osa);
+
if (signum <= 0 || signum >= NSIG ||
- (SCARG(uap, nsa) && (signum == SIGKILL || signum == SIGSTOP)))
+ (nsa && (signum == SIGKILL || signum == SIGSTOP)))
return (EINVAL);
sa = &vec;
- if (SCARG(uap, osa)) {
+ if (osa) {
sa->sa_handler = ps->ps_sigact[signum];
sa->sa_mask = ps->ps_catchmask[signum];
bit = sigmask(signum);
@@ -250,12 +255,12 @@ sys_sigaction(struct proc *p, void *v, register_t *retval)
if ((sa->sa_mask & bit) == 0)
sa->sa_flags |= SA_NODEFER;
sa->sa_mask &= ~bit;
- error = copyout(sa, SCARG(uap, osa), sizeof (vec));
+ error = copyout(sa, osa, sizeof (vec));
if (error)
return (error);
}
- if (SCARG(uap, nsa)) {
- error = copyin(SCARG(uap, nsa), sa, sizeof (vec));
+ if (nsa) {
+ error = copyin(nsa, sa, sizeof (vec));
if (error)
return (error);
setsigvec(p, signum, sa);
@@ -416,23 +421,22 @@ sys_sigprocmask(struct proc *p, void *v, register_t *retval)
} */ *uap = v;
int error = 0;
int s;
+ sigset_t mask;
*retval = p->p_sigmask;
+ mask = SCARG(uap, mask);
s = splhigh();
switch (SCARG(uap, how)) {
case SIG_BLOCK:
- p->p_sigmask |= SCARG(uap, mask) &~ sigcantmask;
+ p->p_sigmask |= mask &~ sigcantmask;
break;
-
case SIG_UNBLOCK:
- p->p_sigmask &= ~SCARG(uap, mask);
+ p->p_sigmask &= ~mask;
break;
-
case SIG_SETMASK:
- p->p_sigmask = SCARG(uap, mask) &~ sigcantmask;
+ p->p_sigmask = mask &~ sigcantmask;
break;
-
default:
error = EINVAL;
break;
@@ -490,21 +494,26 @@ sys_osigaltstack(struct proc *p, void *v, register_t *retval)
} */ *uap = v;
struct sigacts *psp;
struct osigaltstack ss;
+ const struct osigaltstack *nss;
+ struct osigaltstack *oss;
int error;
+ nss = SCARG(uap, nss);
+ oss = SCARG(uap, oss);
+
psp = p->p_sigacts;
if ((psp->ps_flags & SAS_ALTSTACK) == 0)
psp->ps_sigstk.ss_flags |= SS_DISABLE;
- if (SCARG(uap, oss)) {
+ if (oss) {
ss.ss_sp = psp->ps_sigstk.ss_sp;
ss.ss_size = psp->ps_sigstk.ss_size;
ss.ss_flags = psp->ps_sigstk.ss_flags;
- if ((error = copyout(&ss, SCARG(uap, oss), sizeof(ss))))
+ if ((error = copyout(&ss, oss, sizeof(ss))))
return (error);
}
- if (SCARG(uap, nss) == NULL)
+ if (nss == NULL)
return (0);
- error = copyin(SCARG(uap, nss), &ss, sizeof(ss));
+ error = copyin(nss, &ss, sizeof(ss));
if (error)
return (error);
if (ss.ss_flags & SS_DISABLE) {
@@ -532,17 +541,22 @@ sys_sigaltstack(struct proc *p, void *v, register_t *retval)
} */ *uap = v;
struct sigacts *psp;
struct sigaltstack ss;
+ const struct sigaltstack *nss;
+ struct sigaltstack *oss;
int error;
+ nss = SCARG(uap, nss);
+ oss = SCARG(uap, oss);
+
psp = p->p_sigacts;
if ((psp->ps_flags & SAS_ALTSTACK) == 0)
psp->ps_sigstk.ss_flags |= SS_DISABLE;
- if (SCARG(uap, oss) && (error = copyout(&psp->ps_sigstk,
- SCARG(uap, oss), sizeof(struct sigaltstack))))
+ if (oss && (error = copyout(&psp->ps_sigstk,
+ oss, sizeof(struct sigaltstack))))
return (error);
- if (SCARG(uap, nss) == NULL)
+ if (nss == NULL)
return (0);
- error = copyin(SCARG(uap, nss), &ss, sizeof(ss));
+ error = copyin(nss, &ss, sizeof(ss));
if (error)
return (error);
if (ss.ss_flags & SS_DISABLE) {