From 36d0a23124874c6213b850ba9133a9fa43c3e1b9 Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Fri, 8 Feb 2008 04:19:03 -0800 Subject: [PATCH] --- yaml --- r: 84652 b: refs/heads/master c: 20686a309aa98c518adbbd9b57cdbb1804143deb h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/signal.c | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index c09838e508e4..529e7bcbfc50 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9cbab8100538efdd93aeae6fc37787d986f2f558 +refs/heads/master: 20686a309aa98c518adbbd9b57cdbb1804143deb diff --git a/trunk/kernel/signal.c b/trunk/kernel/signal.c index 678bffa437c1..3fca710a5cd7 100644 --- a/trunk/kernel/signal.c +++ b/trunk/kernel/signal.c @@ -1591,10 +1591,10 @@ static int sigkill_pending(struct task_struct *tsk) * That makes it a way to test a stopped process for * being ptrace-stopped vs being job-control-stopped. * - * If we actually decide not to stop at all because the tracer is gone, - * we leave nostop_code in current->exit_code. + * If we actually decide not to stop at all because the tracer + * is gone, we keep current->exit_code unless clear_code. */ -static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) +static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info) { int killed = 0; @@ -1641,7 +1641,8 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) * Don't drop the lock yet, another tracer may come. */ __set_current_state(TASK_RUNNING); - current->exit_code = nostop_code; + if (clear_code) + current->exit_code = 0; read_unlock(&tasklist_lock); } @@ -1675,7 +1676,7 @@ void ptrace_notify(int exit_code) /* Let the debugger run. */ spin_lock_irq(¤t->sighand->siglock); - ptrace_stop(exit_code, 0, &info); + ptrace_stop(exit_code, 1, &info); spin_unlock_irq(¤t->sighand->siglock); } @@ -1782,7 +1783,7 @@ int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, ptrace_signal_deliver(regs, cookie); /* Let the debugger run. */ - ptrace_stop(signr, signr, info); + ptrace_stop(signr, 0, info); /* We're back. Did the debugger cancel the sig? */ signr = current->exit_code;