From f3b5414816d1323fb952a52969123786b389a6c0 Mon Sep 17 00:00:00 2001 From: Theo de Raadt Date: Fri, 6 Sep 2019 12:22:02 +0000 Subject: If uvm_map_inentry returns false then a signal has been delivered, and userret() must be called on trap() exit to deliver it, rather than repeating the same cause infinitely. discovered by George Koehler ok kettenis bluhm visa --- sys/arch/arm64/arm64/trap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'sys/arch/arm64') diff --git a/sys/arch/arm64/arm64/trap.c b/sys/arch/arm64/arm64/trap.c index a92ddd06900..b346196430b 100644 --- a/sys/arch/arm64/arm64/trap.c +++ b/sys/arch/arm64/arm64/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.24 2019/07/09 23:48:07 deraadt Exp $ */ +/* $OpenBSD: trap.c,v 1.25 2019/09/06 12:22:01 deraadt Exp $ */ /*- * Copyright (c) 2014 Andrew Turner * All rights reserved. @@ -245,9 +245,9 @@ do_el0_sync(struct trapframe *frame) if (!uvm_map_inentry(p, &p->p_spinentry, PROC_STACK(p), "[%s]%d/%d sp=%lx inside %lx-%lx: not MAP_STACK\n", uvm_map_inentry_sp, p->p_vmspace->vm_map.sserial)) - return; + goto out; - switch(exception) { + switch (exception) { case EXCP_UNKNOWN: vfp_save(); curcpu()->ci_flush_bp(); @@ -316,7 +316,7 @@ do_el0_sync(struct trapframe *frame) sigexit(p, SIGILL); KERNEL_UNLOCK(); } - +out: userret(p); } -- cgit v1.2.3