arm64: force_signal_inject: WARN if called from kernel context
authorWill Deacon <will.deacon@arm.com>
Tue, 14 Aug 2018 15:24:54 +0000 (16:24 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 14 Sep 2018 16:46:24 +0000 (17:46 +0100)
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>
arch/arm64/kernel/traps.c

index 148de417ed3ecb1ff2afb791f6a3e36fb473fe80..539b470f952623e9fdbce5b2d5c79ecacc98eeae 100644 (file)
@@ -354,6 +354,9 @@ void force_signal_inject(int signal, int code, unsigned long address)
        const char *desc;
        struct pt_regs *regs = current_pt_regs();
 
+       if (WARN_ON(!user_mode(regs)))
+               return;
+
        clear_siginfo(&info);
 
        switch (signal) {
@@ -408,8 +411,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
        if (call_undef_hook(regs) == 0)
                return;
 
-       force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc);
        BUG_ON(!user_mode(regs));
+       force_signal_inject(SIGILL, ILL_ILLOPC, regs->pc);
 }
 
 #define __user_cache_maint(insn, address, res)                 \