]> git.hungrycats.org Git - linux/commitdiff
Clean up ptrace child exit case.
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 17 Jul 2004 14:51:57 +0000 (07:51 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sat, 17 Jul 2004 14:51:57 +0000 (07:51 -0700)
This also fixes it for when the real parent is ignoring
SIGCHLD - noted by David Mosberger.

kernel/exit.c

index 5d13c054d256505509373dad51270086df8aa82d..2b2f728220e41e6e9f366c5fe505cc654a094db2 100644 (file)
@@ -1018,20 +1018,17 @@ static int wait_task_zombie(task_t *p, unsigned int __user *stat_addr, struct ru
                if (p->real_parent != p->parent) {
                        __ptrace_unlink(p);
                        p->state = TASK_ZOMBIE;
-                       /* If this is a detached thread, this is where it goes away.  */
-                       if (p->exit_signal == -1) {
-                               /* release_task takes the lock itself.  */
-                               write_unlock_irq(&tasklist_lock);
-                               release_task (p);
-                       }
-                       else {
+                       /*
+                        * If this is not a detached task, notify the parent.  If it's
+                        * still not detached after that, don't release it now.
+                        */
+                       if (p->exit_signal != -1) {
                                do_notify_parent(p, p->exit_signal);
-                               write_unlock_irq(&tasklist_lock);
+                               if (p->exit_signal != -1)
+                                       p = NULL;
                        }
-                       p = NULL;
                }
-               else
-                       write_unlock_irq(&tasklist_lock);
+               write_unlock_irq(&tasklist_lock);
        }
        if (p != NULL)
                release_task(p);