]> git.hungrycats.org Git - linux/commitdiff
[PATCH] ppc signal handling fixes
authorMikael Pettersson <mikpe@csd.uu.se>
Wed, 25 Aug 2004 11:01:20 +0000 (04:01 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Wed, 25 Aug 2004 11:01:20 +0000 (04:01 -0700)
2.6.8-rc2-mm1 reintroduced the signal-race-fixes patch for i386, x86_64,
s390, and ia64, breaking all other archs.

The patch below updates ppc, following the pattern of i386.  Compiled &
runtime tested.  No observable breakage.

Signed-off-by: Mikael Pettersson <mikpe@csd.uu.se>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/ppc/kernel/signal.c

index 8fc1b8e58e93cea66e5fbf34c7e4fddb4be4e14a..ac2673ca5133a17bf547368c82214004c0f72d18 100644 (file)
@@ -600,7 +600,7 @@ badframe:
 int do_signal(sigset_t *oldset, struct pt_regs *regs)
 {
        siginfo_t info;
-       struct k_sigaction *ka;
+       struct k_sigaction ka;
        unsigned long frame, newsp;
        int signr, ret;
 
@@ -609,9 +609,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
 
        newsp = frame = 0;
 
-       signr = get_signal_to_deliver(&info, regs, NULL);
-
-       ka = (signr == 0)? NULL: &current->sighand->action[signr-1];
+       signr = get_signal_to_deliver(&info, &ka, regs, NULL);
 
        if (TRAP(regs) == 0x0C00                /* System Call! */
            && regs->ccr & 0x10000000           /* error signalled */
@@ -622,7 +620,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
                if (signr > 0
                    && (ret == ERESTARTNOHAND || ret == ERESTART_RESTARTBLOCK
                        || (ret == ERESTARTSYS
-                           && !(ka->sa.sa_flags & SA_RESTART)))) {
+                           && !(ka.sa.sa_flags & SA_RESTART)))) {
                        /* make the system call return an EINTR error */
                        regs->result = -EINTR;
                        regs->gpr[3] = EINTR;
@@ -641,7 +639,7 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
        if (signr == 0)
                return 0;               /* no signals delivered */
 
-       if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size
+       if ((ka.sa.sa_flags & SA_ONSTACK) && current->sas_ss_size
            && !on_sig_stack(regs->gpr[1]))
                newsp = current->sas_ss_sp + current->sas_ss_size;
        else
@@ -649,17 +647,14 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
        newsp &= ~0xfUL;
 
        /* Whee!  Actually deliver the signal.  */
-       if (ka->sa.sa_flags & SA_SIGINFO)
-               handle_rt_signal(signr, ka, &info, oldset, regs, newsp);
+       if (ka.sa.sa_flags & SA_SIGINFO)
+               handle_rt_signal(signr, &ka, &info, oldset, regs, newsp);
        else
-               handle_signal(signr, ka, &info, oldset, regs, newsp);
-
-       if (ka->sa.sa_flags & SA_ONESHOT)
-               ka->sa.sa_handler = SIG_DFL;
+               handle_signal(signr, &ka, &info, oldset, regs, newsp);
 
-       if (!(ka->sa.sa_flags & SA_NODEFER)) {
+       if (!(ka.sa.sa_flags & SA_NODEFER)) {
                spin_lock_irq(&current->sighand->siglock);
-               sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+               sigorsets(&current->blocked,&current->blocked,&ka.sa.sa_mask);
                sigaddset(&current->blocked, signr);
                recalc_sigpending();
                spin_unlock_irq(&current->sighand->siglock);