]> git.baikalelectronics.ru Git - kernel.git/commit
ptrace: tracehook_report_clone: fix false positives
authorOleg Nesterov <oleg@redhat.com>
Thu, 4 Jun 2009 23:29:07 +0000 (16:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Jun 2009 01:07:40 +0000 (18:07 -0700)
commitb8eb8c48d11efe7febe1a0def74b956d3780bf02
tree25a72acabe05c3e72dddd942855d4245dfae4b82
parent4c37e11b35ca8be64f92f1e494dc1c3d51100717
ptrace: tracehook_report_clone: fix false positives

The "trace || CLONE_PTRACE" check in tracehook_report_clone() is not right,

- If the untraced task does clone(CLONE_PTRACE) the new child is not traced,
  we must not queue SIGSTOP.

- If we forked the traced task, but the tracer exits and untraces both the
  forking task and the new child (after copy_process() drops tasklist_lock),
  we should not queue SIGSTOP too.

Change the code to check task_ptrace() != 0 instead. This is still racy, but
the race is harmless.

We can race with another tracer attaching to this child, or the tracer can
exit and detach in parallel. But giwen that we didn't do wake_up_new_task()
yet, the child must have the pending SIGSTOP anyway.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Roland McGrath <roland@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
include/linux/tracehook.h
kernel/fork.c