diff -Bru 0/include/linux/tracehook.h 1/include/linux/tracehook.h --- 0/include/linux/tracehook.h 2008-08-18 20:43:21.000000000 -0400 +++ 1/include/linux/tracehook.h 2008-09-09 09:51:14.000000000 -0400 @@ -195,8 +195,10 @@ struct pt_regs *regs) { if (!ptrace_event(PT_TRACE_EXEC, PTRACE_EVENT_EXEC, 0) && - unlikely(task_ptrace(current) & PT_PTRACED)) + unlikely(task_ptrace(current) & PT_PTRACED)){ send_sig(SIGTRAP, current, 0); + set_tsk_thread_flag(current,TIF_SIGPENDING); + } } /** diff -Bru 0/kernel/signal.c 1/kernel/signal.c --- 0/kernel/signal.c 2008-08-18 20:43:21.000000000 -0400 +++ 1/kernel/signal.c 2008-09-09 09:50:38.000000000 -0400 @@ -384,8 +384,14 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask, siginfo_t *info) { - int sig = next_signal(pending, mask); + int sig = 0; + int allow_trap = 0; + if((current->ptrace & PT_PTRACED) && sigismember(mask,SIGTRAP)){ + sigdelset(mask,SIGTRAP); + allow_trap = 1; + } + sig = next_signal(pending, mask); if (sig) { if (current->notifier) { if (sigismember(current->notifier_mask, sig)) { @@ -399,6 +405,9 @@ collect_signal(sig, pending, info); } + if(allow_trap) + sigaddset(mask,SIGTRAP); + return sig; }