]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] ptrace-fix-2.5.33-A1
authorIngo Molnar <mingo@elte.hu>
Thu, 5 Sep 2002 01:42:21 +0000 (18:42 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Thu, 5 Sep 2002 01:42:21 +0000 (18:42 -0700)
This contains Daniel's suggested fix that allows a parent to
PTRACE_ATTACH to a child it forked.  That fixes the incorrect BUG_ON()
assert that Ogawa's patch was intended to fix, and we thus undo Ogawa's
patch.

I've tested various ptrace uses and they appear to work just fine.

kernel/exit.c
kernel/ptrace.c

index 918f562138f5e860449cf5ac3bd8118939f2d58e..fb08ef1cb83887270c67f57645b9d73ab0ae9c42 100644 (file)
@@ -66,7 +66,8 @@ static void release_task(struct task_struct * p)
        atomic_dec(&p->user->processes);
        security_ops->task_free_security(p);
        free_uid(p->user);
-       BUG_ON(!list_empty(&p->ptrace_list) || !list_empty(&p->ptrace_children));
+       BUG_ON(p->ptrace || !list_empty(&p->ptrace_list) ||
+                                       !list_empty(&p->ptrace_children));
        unhash_process(p);
 
        release_thread(p);
@@ -718,8 +719,14 @@ repeat:
                                        ptrace_unlink(p);
                                        do_notify_parent(p, SIGCHLD);
                                        write_unlock_irq(&tasklist_lock);
-                               } else
+                               } else {
+                                       if (p->ptrace) {
+                                               write_lock_irq(&tasklist_lock);
+                                               ptrace_unlink(p);
+                                               write_unlock_irq(&tasklist_lock);
+                                       }
                                        release_task(p);
+                               }
                                goto end_wait4;
                        default:
                                continue;
index 8db5da3f834940d20b5ef064d82478f8d08e10c6..4feba1214dc06df97077d858ad1096f04d4f7cd1 100644 (file)
@@ -29,7 +29,7 @@ void __ptrace_link(task_t *child, task_t *new_parent)
        if (!list_empty(&child->ptrace_list))
                BUG();
        if (child->parent == new_parent)
-               BUG();
+               return;
        list_add(&child->ptrace_list, &child->parent->ptrace_children);
        REMOVE_LINKS(child);
        child->parent = new_parent;