I wonder how to check whether the child wasI still haven't solved the problems with checkingNot sure I understand your question...
parent and checking ptrace, so ignore them for
now (or give me the hints:)
No, the idea was like that: the old parent either wait()s or+ while_each_thread(me, p) {Eek. Even ignoring ptrace, this is weird. We change parent/real_parent,
+ if (!ptrace_reparented(p))
+ p->parent = pid_ns->child_reaper;
+ p->real_parent = pid_ns->child_reaper;
but we do not do list_move_tail(sibling) until wait_task_detached() !
No, I think we should not do this even if this was correct. I'll try
to nack this in any case, even if there were no immediate problems ;)
IMHO, this is insane.
But this is wrong. Well. Suppose that the caller of PR_DETACH exits
before the old parent does do_wait(). What /sbin/init (who is the new
parent) can do after it gets SIGCHLD? If can't see this zombie. Nor
the old parent can release this task due to ->detaching. Eventually
/sbin/init can reap it if it does, say, waitpid(-1), but still this
is wrong.
Or. Suppose that the old parent exits after its child does PR_DETACH.How? I think I prevented that with this:
You changed forget_original_parent() but this is not enough, note that
find_new_reaper() can pick the live sub-thread. In this case the child
will be moved to init's ->children list, and after that we are changing
->real_parent back.