]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/ia64/kernel/signal.c
signal/ia64: Use the generic force_sigsegv in setup_frame
[mirror_ubuntu-bionic-kernel.git] / arch / ia64 / kernel / signal.c
index a254cc98f95c6c201c9d3307e2a3bb0df2f2dc5e..ef67bc1673f1ce605de205cd95db0055fcb36fb3 100644 (file)
@@ -282,36 +282,6 @@ rbs_on_sig_stack (unsigned long bsp)
        return (bsp - current->sas_ss_sp < current->sas_ss_size);
 }
 
-static long
-force_sigsegv_info (int sig, void __user *addr)
-{
-       unsigned long flags;
-       struct siginfo si;
-
-       if (sig == SIGSEGV) {
-               /*
-                * Acquiring siglock around the sa_handler-update is almost
-                * certainly overkill, but this isn't a
-                * performance-critical path and I'd rather play it safe
-                * here than having to debug a nasty race if and when
-                * something changes in kernel/signal.c that would make it
-                * no longer safe to modify sa_handler without holding the
-                * lock.
-                */
-               spin_lock_irqsave(&current->sighand->siglock, flags);
-               current->sighand->action[sig - 1].sa.sa_handler = SIG_DFL;
-               spin_unlock_irqrestore(&current->sighand->siglock, flags);
-       }
-       si.si_signo = SIGSEGV;
-       si.si_errno = 0;
-       si.si_code = SI_KERNEL;
-       si.si_pid = task_pid_vnr(current);
-       si.si_uid = from_kuid_munged(current_user_ns(), current_uid());
-       si.si_addr = addr;
-       force_sig_info(SIGSEGV, &si, current);
-       return 1;
-}
-
 static long
 setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr)
 {
@@ -345,15 +315,18 @@ setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr)
                         * instead so we will die with SIGSEGV.
                         */
                        check_sp = (new_sp - sizeof(*frame)) & -STACK_ALIGN;
-                       if (!likely(on_sig_stack(check_sp)))
-                               return force_sigsegv_info(ksig->sig, (void __user *)
-                                                         check_sp);
+                       if (!likely(on_sig_stack(check_sp))) {
+                               force_sigsegv(ksig->sig, current);
+                               return 1;
+                       }
                }
        }
        frame = (void __user *) ((new_sp - sizeof(*frame)) & -STACK_ALIGN);
 
-       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
-               return force_sigsegv_info(ksig->sig, frame);
+       if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) {
+               force_sigsegv(ksig->sig, current);
+               return 1;
+       }
 
        err  = __put_user(ksig->sig, &frame->arg0);
        err |= __put_user(&frame->info, &frame->arg1);
@@ -367,8 +340,10 @@ setup_frame(struct ksignal *ksig, sigset_t *set, struct sigscratch *scr)
        err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12);
        err |= setup_sigcontext(&frame->sc, set, scr);
 
-       if (unlikely(err))
-               return force_sigsegv_info(ksig->sig, frame);
+       if (unlikely(err)) {
+               force_sigsegv(ksig->sig, current);
+               return 1;
+       }
 
        scr->pt.r12 = (unsigned long) frame - 16;       /* new stack pointer */
        scr->pt.ar_fpsr = FPSR_DEFAULT;                 /* reset fpsr for signal handler */