From 308099f9ffa433934cc1a1b61aad7ebb87df1bb5 Mon Sep 17 00:00:00 2001 From: jhb Date: Mon, 22 Dec 2014 21:46:35 +0000 Subject: [PATCH] MFC 275035: MFamd64: Check for invalid flags in the machine context in sigreturn() and setcontext(). git-svn-id: svn://svn.freebsd.org/base/stable/10@276085 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/i386/i386/machdep.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sys/i386/i386/machdep.c b/sys/i386/i386/machdep.c index f7137148e..48a7e622f 100644 --- a/sys/i386/i386/machdep.c +++ b/sys/i386/i386/machdep.c @@ -1043,6 +1043,11 @@ sys_sigreturn(td, uap) if (error != 0) return (error); ucp = &uc; + if ((ucp->uc_mcontext.mc_flags & ~_MC_FLAG_MASK) != 0) { + uprintf("pid %d (%s): sigreturn mc_flags %x\n", p->p_pid, + td->td_name, ucp->uc_mcontext.mc_flags); + return (EINVAL); + } regs = td->td_frame; eflags = ucp->uc_mcontext.mc_eflags; if (eflags & PSL_VM) { @@ -3540,7 +3545,8 @@ set_mcontext(struct thread *td, const mcontext_t *mcp) int eflags, ret; tp = td->td_frame; - if (mcp->mc_len != sizeof(*mcp)) + if (mcp->mc_len != sizeof(*mcp) || + (mcp->mc_flags & ~_MC_FLAG_MASK) != 0) return (EINVAL); eflags = (mcp->mc_eflags & PSL_USERCHANGE) | (tp->tf_eflags & ~PSL_USERCHANGE); -- 2.45.0