signal/x86: Use force_sig_fault where appropriate
authorEric W. Biederman <ebiederm@xmission.com>
Mon, 17 Sep 2018 23:16:39 +0000 (01:16 +0200)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 21 Sep 2018 13:30:54 +0000 (15:30 +0200)
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
arch/x86/entry/vsyscall/vsyscall_64.c
arch/x86/kernel/ptrace.c
arch/x86/kernel/traps.c
arch/x86/kernel/umip.c

index 82ed001..85fd85d 100644 (file)
@@ -100,20 +100,13 @@ static bool write_ok_or_segv(unsigned long ptr, size_t size)
         */
 
        if (!access_ok(VERIFY_WRITE, (void __user *)ptr, size)) {
-               siginfo_t info;
                struct thread_struct *thread = &current->thread;
 
                thread->error_code      = 6;  /* user fault, no page, write */
                thread->cr2             = ptr;
                thread->trap_nr         = X86_TRAP_PF;
 
-               clear_siginfo(&info);
-               info.si_signo           = SIGSEGV;
-               info.si_errno           = 0;
-               info.si_code            = SEGV_MAPERR;
-               info.si_addr            = (void __user *)ptr;
-
-               force_sig_info(SIGSEGV, &info, current);
+               force_sig_fault(SIGSEGV, SEGV_MAPERR, (void __user *)ptr, current);
                return false;
        } else {
                return true;
index 511ea0f..a78fff5 100644 (file)
@@ -1372,18 +1372,12 @@ const struct user_regset_view *task_user_regset_view(struct task_struct *task)
 void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
                                         int error_code, int si_code)
 {
-       struct siginfo info;
-
-       clear_siginfo(&info);
        tsk->thread.trap_nr = X86_TRAP_DB;
        tsk->thread.error_code = error_code;
 
-       info.si_signo = SIGTRAP;
-       info.si_code = si_code;
-       info.si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
-
        /* Send us the fake SIGTRAP */
-       force_sig_info(SIGTRAP, &info, tsk);
+       force_sig_fault(SIGTRAP, si_code,
+                       user_mode(regs) ? (void __user *)regs->ip : NULL, tsk);
 }
 
 void user_single_step_report(struct pt_regs *regs)
index ce9a411..34a327f 100644 (file)
@@ -808,7 +808,7 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
 {
        struct task_struct *task = current;
        struct fpu *fpu = &task->thread.fpu;
-       siginfo_t info;
+       int si_code;
        char *str = (trapnr == X86_TRAP_MF) ? "fpu exception" :
                                                "simd exception";
 
@@ -834,18 +834,14 @@ static void math_error(struct pt_regs *regs, int error_code, int trapnr)
 
        task->thread.trap_nr    = trapnr;
        task->thread.error_code = error_code;
-       clear_siginfo(&info);
-       info.si_signo           = SIGFPE;
-       info.si_errno           = 0;
-       info.si_addr            = (void __user *)uprobe_get_trap_addr(regs);
-
-       info.si_code = fpu__exception_code(fpu, trapnr);
 
+       si_code = fpu__exception_code(fpu, trapnr);
        /* Retry when we get spurious exceptions: */
-       if (!info.si_code)
+       if (!si_code)
                return;
 
-       force_sig_info(SIGFPE, &info, task);
+       force_sig_fault(SIGFPE, si_code,
+                       (void __user *)uprobe_get_trap_addr(regs), task);
 }
 
 dotraplinkage void do_coprocessor_error(struct pt_regs *regs, long error_code)
index ff20b35..f8f3cfd 100644 (file)
@@ -271,19 +271,13 @@ static int emulate_umip_insn(struct insn *insn, int umip_inst,
  */
 static void force_sig_info_umip_fault(void __user *addr, struct pt_regs *regs)
 {
-       siginfo_t info;
        struct task_struct *tsk = current;
 
        tsk->thread.cr2         = (unsigned long)addr;
        tsk->thread.error_code  = X86_PF_USER | X86_PF_WRITE;
        tsk->thread.trap_nr     = X86_TRAP_PF;
 
-       clear_siginfo(&info);
-       info.si_signo   = SIGSEGV;
-       info.si_errno   = 0;
-       info.si_code    = SEGV_MAPERR;
-       info.si_addr    = addr;
-       force_sig_info(SIGSEGV, &info, tsk);
+       force_sig_fault(SIGSEGV, SEGV_MAPERR, addr, tsk);
 
        if (!(show_unhandled_signals && unhandled_signal(tsk, SIGSEGV)))
                return;