summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_sig.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index d204949..14e8a54 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1157,33 +1157,27 @@ osigstack(td, uap)
register struct osigstack_args *uap;
{
struct proc *p = td->td_proc;
- struct sigstack ss;
+ struct sigstack nss, oss;
int error = 0;
- mtx_lock(&Giant);
-
- if (uap->oss != NULL) {
- PROC_LOCK(p);
- ss.ss_sp = p->p_sigstk.ss_sp;
- ss.ss_onstack = sigonstack(cpu_getstack(td));
- PROC_UNLOCK(p);
- error = copyout(&ss, uap->oss, sizeof(struct sigstack));
+ if (uap->nss != NULL) {
+ error = copyin(uap->nss, &nss, sizeof(nss));
if (error)
- goto done2;
+ return (error);
}
-
+ PROC_LOCK(p);
+ oss.ss_sp = p->p_sigstk.ss_sp;
+ oss.ss_onstack = sigonstack(cpu_getstack(td));
if (uap->nss != NULL) {
- if ((error = copyin(uap->nss, &ss, sizeof(ss))) != 0)
- goto done2;
- PROC_LOCK(p);
- p->p_sigstk.ss_sp = ss.ss_sp;
+ p->p_sigstk.ss_sp = nss.ss_sp;
p->p_sigstk.ss_size = 0;
- p->p_sigstk.ss_flags |= ss.ss_onstack & SS_ONSTACK;
+ p->p_sigstk.ss_flags |= nss.ss_onstack & SS_ONSTACK;
p->p_flag |= P_ALTSTACK;
- PROC_UNLOCK(p);
}
-done2:
- mtx_unlock(&Giant);
+ PROC_UNLOCK(p);
+ if (uap->oss != NULL)
+ error = copyout(&oss, uap->oss, sizeof(oss));
+
return (error);
}
#endif /* COMPAT_43 || COMPAT_SUNOS */
OpenPOWER on IntegriCloud