Blob Blame History Raw
From: Will Deacon <will.deacon@arm.com>
Date: Tue, 14 Aug 2018 16:24:54 +0100
Subject: arm64: force_signal_inject: WARN if called from kernel context

Git-commit: 8a60419d36762a1131c2b29f7bd14371db4df1b5
Patch-mainline: v4.20-rc1
References: jsc#ECO-561

force_signal_inject() is designed to send a fatal signal to userspace,
so WARN if the current pt_regs indicates a kernel context. This can
currently happen for the undefined instruction trap, so patch that up so
we always BUG() if we didn't have a handler.

Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de>
---
 arch/arm64/kernel/traps.c |    5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

--- a/arch/arm64/kernel/traps.c
+++ b/arch/arm64/kernel/traps.c
@@ -315,6 +315,9 @@ void force_signal_inject(int signal, int
 	void __user *pc = (void __user *)instruction_pointer(regs);
 	const char *desc;
 
+	if (WARN_ON(!user_mode(regs)))
+		return;
+
 	switch (signal) {
 	case SIGILL:
 		desc = "undefined instruction";
@@ -368,8 +371,8 @@ asmlinkage void __exception do_undefinst
 	if (call_undef_hook(regs) == 0)
 		return;
 
-	force_signal_inject(SIGILL, ILL_ILLOPC, regs, 0);
 	BUG_ON(!user_mode(regs));
+	force_signal_inject(SIGILL, ILL_ILLOPC, regs, 0);
 }
 
 #define __user_cache_maint(insn, address, res)			\