From: Roland McGrath Back about a year ago when I last fiddled heavily with the do_wait code, I was thinking too hard about the wrong thing and I now think I introduced a bug whose inverse thought I was fixing. Apparently noone was looking too hard over much shoulder, so as to cite my bogus reasoning at the time. In the race condition when PTRACE_ATTACH is about to steal a child and then the child hits a tracing event (what my_ptrace_child checks for), the real parent does need to set its flag noting it has some eligible live children. Otherwise a spurious ECHILD error is possible, since the child in question is not yet on the ptrace_children list. Signed-off-by: Roland McGrath Signed-off-by: Andrew Morton --- kernel/exit.c | 9 +++++++++ 1 files changed, 9 insertions(+) diff -puN kernel/exit.c~wait4-ptrace_attach-race-fix kernel/exit.c --- devel/kernel/exit.c~wait4-ptrace_attach-race-fix 2005-10-13 15:44:51.000000000 -0700 +++ devel-akpm/kernel/exit.c 2005-10-13 15:44:51.000000000 -0700 @@ -1379,6 +1379,15 @@ repeat: switch (p->state) { case TASK_TRACED: + /* + * When we hit the race with PTRACE_ATTACH, + * we will not report this child. But the + * race means it has not yet been moved to + * our ptrace_children list, so we need to + * set the flag here to avoid a spurious ECHILD + * when the race happens with the only child. + */ + flag = 1; if (!my_ptrace_child(p)) continue; /*FALLTHROUGH*/ _