diff options
-rw-r--r-- | sys/kern/kern_sig.c | 32 |
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 */ |