return (void __user *)((rsp - frame_size) & -8UL);
 }
 
-void ia32_setup_frame(int sig, struct k_sigaction *ka,
-                       compat_sigset_t *set, struct pt_regs * regs)
+int ia32_setup_frame(int sig, struct k_sigaction *ka,
+                    compat_sigset_t *set, struct pt_regs * regs)
 {
        struct sigframe __user *frame;
        int err = 0;
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
-       return;
+       return 1;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return 0;
 }
 
-void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-                          compat_sigset_t *set, struct pt_regs * regs)
+int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+                       compat_sigset_t *set, struct pt_regs * regs)
 {
        struct rt_sigframe __user *frame;
        int err = 0;
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
-       return;
+       return 1;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return 0;
 }
-
 
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
-void ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                sigset_t *set, struct pt_regs * regs); 
-void ia32_setup_frame(int sig, struct k_sigaction *ka,
+int ia32_setup_frame(int sig, struct k_sigaction *ka,
             sigset_t *set, struct pt_regs * regs); 
 
 asmlinkage long
        return (void __user *)round_down(rsp - size, 16); 
 }
 
-static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
+static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                           sigset_t *set, struct pt_regs * regs)
 {
        struct rt_sigframe __user *frame;
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
-       return;
+       return 1;
 
 give_sigsegv:
        force_sigsegv(sig, current);
+       return 0;
 }
 
 /*
  * OK, we're invoking a handler
  */    
 
-static void
+static int
 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
                sigset_t *oldset, struct pt_regs *regs)
 {
+       int ret;
+
 #ifdef DEBUG_SIG
        printk("handle_signal pid:%d sig:%lu rip:%lx rsp:%lx regs=%p\n",
                current->pid, sig,
 #ifdef CONFIG_IA32_EMULATION
        if (test_thread_flag(TIF_IA32)) {
                if (ka->sa.sa_flags & SA_SIGINFO)
-                       ia32_setup_rt_frame(sig, ka, info, oldset, regs);
+                       ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs);
                else
-                       ia32_setup_frame(sig, ka, oldset, regs);
+                       ret = ia32_setup_frame(sig, ka, oldset, regs);
        } else 
 #endif
-       setup_rt_frame(sig, ka, info, oldset, regs);
+       ret = setup_rt_frame(sig, ka, info, oldset, regs);
 
-       if (!(ka->sa.sa_flags & SA_NODEFER)) {
+       if (ret && !(ka->sa.sa_flags & SA_NODEFER)) {
                spin_lock_irq(¤t->sighand->siglock);
                sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
                sigaddset(¤t->blocked,sig);
                recalc_sigpending();
                spin_unlock_irq(¤t->sighand->siglock);
        }
+
+       return ret;
 }
 
 /*
                        asm volatile("movq %0,%%db7"    : : "r" (current->thread.debugreg7));
 
                /* Whee!  Actually deliver the signal.  */
-               handle_signal(signr, &info, &ka, oldset, regs);
-               return 1;
+               return handle_signal(signr, &info, &ka, oldset, regs);
        }
 
  no_signal: