Roland, you pushed 2 commits into utrace-ptrace, and the second one "ptrace_do_detach: Fiddle code to avoid warnings." c8315d350406b46d6f8bb965f5ebfbf13d7e391d
is not right. - If release == T then ptrace_detach_task() is meaningless, but this is minor. - If release == T then we must do release_task(), and detach must be T too. IOW, with this change release_task() is never called ad we leak the dead task. Instead we do ptrace_detach_task() which is not needed. --- kernel/ptrace.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) --- PU/kernel/ptrace.c~15_GIT_FIXUP 2009-08-25 14:14:39.000000000 +0200 +++ PU/kernel/ptrace.c 2009-08-25 14:56:01.000000000 +0200 @@ -738,8 +738,7 @@ static void ptrace_do_detach(struct task * This tracee can be already killed. Make sure de_thread() or * our sub-thread doing do_wait() didn't do release_task() yet. */ - detach = tracee->ptrace != 0; - release = false; + detach = (tracee->ptrace != 0); if (likely(detach)) { if (valid_signal(data)) tracee->exit_code = data; @@ -747,10 +746,12 @@ static void ptrace_do_detach(struct task } write_unlock_irq(&tasklist_lock); - if (likely(detach)) - ptrace_detach_task(tracee, data); - else if (unlikely(release)) - release_task(tracee); + if (likely(detach)) { + if (unlikely(release)) + release_task(tracee); + else + ptrace_detach_task(tracee, data); + } } int ptrace_detach(struct task_struct *child, unsigned int data)