diff options
-rw-r--r-- | sys/amd64/amd64/machdep.c | 20 | ||||
-rw-r--r-- | sys/i386/i386/machdep.c | 20 |
2 files changed, 24 insertions, 16 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c index b96b93e..6617f17 100644 --- a/sys/amd64/amd64/machdep.c +++ b/sys/amd64/amd64/machdep.c @@ -553,15 +553,17 @@ osigreturn(td, uap) } */ *uap; { #ifdef COMPAT_43 + struct osigcontext sc; struct trapframe *regs; struct osigcontext *scp; struct proc *p = td->td_proc; - int eflags; + int eflags, error; regs = td->td_frame; - scp = uap->sigcntxp; - if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ)) - return (EFAULT); + error = copyin(uap->sigcntxp, &sc, sizeof(sc)); + if (error != 0) + return (error); + scp = ≻ eflags = scp->sc_ps; if (eflags & PSL_VM) { struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; @@ -667,14 +669,16 @@ sigreturn(td, uap) const __ucontext *sigcntxp; } */ *uap; { + ucontext_t uc; struct proc *p = td->td_proc; struct trapframe *regs; const ucontext_t *ucp; - int cs, eflags; + int cs, eflags, error; - ucp = uap->sigcntxp; - if (!useracc((caddr_t)(uintptr_t)ucp, sizeof(*ucp), VM_PROT_READ)) - return (EFAULT); + error = copyin(uap->sigcntxp, &uc, sizeof(uc)); + if (error != 0) + return (error); + ucp = &uc; regs = td->td_frame; eflags = ucp->uc_mcontext.mc_eflags; if (eflags & PSL_VM) { diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index b96b93e..6617f17 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -553,15 +553,17 @@ osigreturn(td, uap) } */ *uap; { #ifdef COMPAT_43 + struct osigcontext sc; struct trapframe *regs; struct osigcontext *scp; struct proc *p = td->td_proc; - int eflags; + int eflags, error; regs = td->td_frame; - scp = uap->sigcntxp; - if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ)) - return (EFAULT); + error = copyin(uap->sigcntxp, &sc, sizeof(sc)); + if (error != 0) + return (error); + scp = ≻ eflags = scp->sc_ps; if (eflags & PSL_VM) { struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs; @@ -667,14 +669,16 @@ sigreturn(td, uap) const __ucontext *sigcntxp; } */ *uap; { + ucontext_t uc; struct proc *p = td->td_proc; struct trapframe *regs; const ucontext_t *ucp; - int cs, eflags; + int cs, eflags, error; - ucp = uap->sigcntxp; - if (!useracc((caddr_t)(uintptr_t)ucp, sizeof(*ucp), VM_PROT_READ)) - return (EFAULT); + error = copyin(uap->sigcntxp, &uc, sizeof(uc)); + if (error != 0) + return (error); + ucp = &uc; regs = td->td_frame; eflags = ucp->uc_mcontext.mc_eflags; if (eflags & PSL_VM) { |