summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/amd64/amd64/machdep.c21
-rw-r--r--sys/i386/i386/machdep.c21
2 files changed, 16 insertions, 26 deletions
diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index d361a27..807ab20 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -708,27 +708,22 @@ sigreturn(td, uap)
} */ *uap;
{
struct proc *p = td->td_proc;
+ struct osigcontext *oscp;
+ struct osigreturn_args *ouap;
struct trapframe *regs;
ucontext_t *ucp;
int cs, eflags;
- ucp = uap->sigcntxp;
#ifdef COMPAT_43
- if (!useracc((caddr_t)ucp, sizeof(struct osigcontext), VM_PROT_READ))
- return (EFAULT);
- if (((struct osigcontext *)ucp)->sc_trapno == 0x01d516)
- return (osigreturn(td, (struct osigreturn_args *)uap));
- /*
- * Since ucp is not an osigcontext but a ucontext_t, we have to
- * check again if all of it is accessible. A ucontext_t is
- * much larger, so instead of just checking for the pointer
- * being valid for the size of an osigcontext, now check for
- * it being valid for a whole, new-style ucontext_t.
- */
+ ouap = (struct osigreturn_args *)uap;
+ oscp = ouap->sigcntxp;
+ if (fuword(&oscp->sc_trapno) == 0x01d516)
+ return (osigreturn(td, ouap));
#endif
+
+ ucp = uap->sigcntxp;
if (!useracc((caddr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
-
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 d361a27..807ab20 100644
--- a/sys/i386/i386/machdep.c
+++ b/sys/i386/i386/machdep.c
@@ -708,27 +708,22 @@ sigreturn(td, uap)
} */ *uap;
{
struct proc *p = td->td_proc;
+ struct osigcontext *oscp;
+ struct osigreturn_args *ouap;
struct trapframe *regs;
ucontext_t *ucp;
int cs, eflags;
- ucp = uap->sigcntxp;
#ifdef COMPAT_43
- if (!useracc((caddr_t)ucp, sizeof(struct osigcontext), VM_PROT_READ))
- return (EFAULT);
- if (((struct osigcontext *)ucp)->sc_trapno == 0x01d516)
- return (osigreturn(td, (struct osigreturn_args *)uap));
- /*
- * Since ucp is not an osigcontext but a ucontext_t, we have to
- * check again if all of it is accessible. A ucontext_t is
- * much larger, so instead of just checking for the pointer
- * being valid for the size of an osigcontext, now check for
- * it being valid for a whole, new-style ucontext_t.
- */
+ ouap = (struct osigreturn_args *)uap;
+ oscp = ouap->sigcntxp;
+ if (fuword(&oscp->sc_trapno) == 0x01d516)
+ return (osigreturn(td, ouap));
#endif
+
+ ucp = uap->sigcntxp;
if (!useracc((caddr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
-
regs = td->td_frame;
eflags = ucp->uc_mcontext.mc_eflags;
if (eflags & PSL_VM) {
OpenPOWER on IntegriCloud