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)

Reply via email to