[PATCH 3/3] ptrace_untrace: fix the SIGNAL_STOP_STOPPED check

From: Oleg Nesterov
Date: Sun Feb 08 2009 - 13:51:00 EST


This bug is ancient too. ptrace_untrace() must not resume the task
if the group stop in progress, we should set TASK_STOPPED instead.

Unfortunately, we still have problems here:

- if the process/thread was traced, SIGNAL_STOP_STOPPED
does not necessary means this thread group is stopped.

- ptrace breaks the bookkeeping of ->group_stop_count.

(the comment above ptrace_untrace() doesn't look exactly right too).

Signed-off-by: Oleg Nesterov <oleg@xxxxxxxxxx>

--- 6.29-rc3/kernel/ptrace.c~3_FIX_STOPPED 2009-02-08 06:22:26.000000000 +0100
+++ 6.29-rc3/kernel/ptrace.c 2009-02-08 08:52:14.000000000 +0100
@@ -60,7 +60,8 @@ static void ptrace_untrace(struct task_s
{
spin_lock(&child->sighand->siglock);
if (task_is_traced(child)) {
- if (child->signal->flags & SIGNAL_STOP_STOPPED)
+ if (child->signal->flags & SIGNAL_STOP_STOPPED ||
+ child->signal->group_stop_count)
__set_task_state(child, TASK_STOPPED);
else
wake_up_process(child);

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/