svn commit: r356840 - head/sys/riscv/riscv
John Baldwin
jhb at FreeBSD.org
Fri Jan 17 19:13:50 UTC 2020
Author: jhb
Date: Fri Jan 17 19:13:49 2020
New Revision: 356840
URL: https://svnweb.freebsd.org/changeset/base/356840
Log:
Check for invalid sstatus values in set_mcontext().
Previously, this check was only in sys_sigreturn() which meant that
user applications could write invalid values to the register via
setcontext() or swapcontext().
Reviewed by: mhorne
Sponsored by: DARPA
Differential Revision: https://reviews.freebsd.org/D23219
Modified:
head/sys/riscv/riscv/machdep.c
Modified: head/sys/riscv/riscv/machdep.c
==============================================================================
--- head/sys/riscv/riscv/machdep.c Fri Jan 17 19:01:59 2020 (r356839)
+++ head/sys/riscv/riscv/machdep.c Fri Jan 17 19:13:49 2020 (r356840)
@@ -367,6 +367,14 @@ set_mcontext(struct thread *td, mcontext_t *mcp)
tf = td->td_frame;
+ /*
+ * Make sure the processor mode has not been tampered with and
+ * interrupts have not been disabled.
+ * Supervisor interrupts in user mode are always enabled.
+ */
+ if ((mcp->mc_gpregs.gp_sstatus & SSTATUS_SPP) != 0)
+ return (EINVAL);
+
memcpy(tf->tf_t, mcp->mc_gpregs.gp_t, sizeof(tf->tf_t));
memcpy(tf->tf_s, mcp->mc_gpregs.gp_s, sizeof(tf->tf_s));
memcpy(tf->tf_a, mcp->mc_gpregs.gp_a, sizeof(tf->tf_a));
@@ -523,21 +531,11 @@ struct sigreturn_args {
int
sys_sigreturn(struct thread *td, struct sigreturn_args *uap)
{
- uint64_t sstatus;
ucontext_t uc;
int error;
if (copyin(uap->sigcntxp, &uc, sizeof(uc)))
return (EFAULT);
-
- /*
- * Make sure the processor mode has not been tampered with and
- * interrupts have not been disabled.
- * Supervisor interrupts in user mode are always enabled.
- */
- sstatus = uc.uc_mcontext.mc_gpregs.gp_sstatus;
- if ((sstatus & SSTATUS_SPP) != 0)
- return (EINVAL);
error = set_mcontext(td, &uc.uc_mcontext);
if (error != 0)
More information about the svn-src-head
mailing list