Jelajahi Sumber

[PATCH] wait4 PTRACE_ATTACH race fix

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 <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Roland McGrath 19 tahun lalu
induk
melakukan
7f2a525559
1 mengubah file dengan 9 tambahan dan 0 penghapusan
  1. 9 0
      kernel/exit.c

+ 9 - 0
kernel/exit.c

@@ -1383,6 +1383,15 @@ repeat:
 
 
 			switch (p->state) {
 			switch (p->state) {
 			case TASK_TRACED:
 			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))
 				if (!my_ptrace_child(p))
 					continue;
 					continue;
 				/*FALLTHROUGH*/
 				/*FALLTHROUGH*/