From: Oleg Nesterov <oleg@tv-sign.ru>
To: Andrew Morton <akpm@osdl.org>
Cc: linux-kernel@vger.kernel.org, Roland McGrath <roland@redhat.com>,
"Eric W. Biederman" <ebiederm@xmission.com>
Subject: [PATCH -mm] coredump-kill-ptrace-related-stuff-fix
Date: Sun, 14 May 2006 22:45:10 +0400 [thread overview]
Message-ID: <20060514184510.GA86@oleg> (raw)
This patch fixes 2 bugs in
"[PATCH 3/4] coredump: kill ptrace related stuff"
coredump-kill-ptrace-related-stuff.patch
1. Roland McGrath pointed out that SIGNAL_GROUP_EXIT can't
prevent the task from going to ptrace_stop() and schedule
in TASK_TRACED state.
As Eric W. Biederman suggested, ptrace_stop() should check
->core_waiters.
2. This patch killed 'if (child->ptrace)' check in ptrace_detach()
because that check was added to protect against ptrace_detach()
vs zap_threads() race.
However, the check is still needed: de_thread() can release the
task after ptrace_check_attach() succeeded.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- MM/kernel/signal.c~1_FIX 2006-04-21 03:26:32.000000000 +0400
+++ MM/kernel/signal.c 2006-05-14 21:22:08.000000000 +0400
@@ -1531,6 +1531,35 @@ static void do_notify_parent_cldstop(str
spin_unlock_irqrestore(&sighand->siglock, flags);
}
+static inline int may_ptrace_stop(void)
+{
+ if (!likely(current->ptrace & PT_PTRACED))
+ return 0;
+
+ if (unlikely(current->parent == current->real_parent &&
+ (current->ptrace & PT_ATTACHED)))
+ return 0;
+
+ if (unlikely(current->signal == current->parent->signal) &&
+ unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))
+ return 0;
+
+ /*
+ * Are we in the middle of do_coredump?
+ * If so and our tracer is also part of the coredump stopping
+ * is a deadlock situation, and pointless because our tracer
+ * is dead so don't allow us to stop.
+ * If SIGKILL was already sent before the caller unlocked
+ * ->siglock we must see ->core_waiters != 0. Otherwise it
+ * is safe to enter schedule().
+ */
+ if (unlikely(current->mm->core_waiters) &&
+ unlikely(current->mm == current->parent->mm))
+ return 0;
+
+ return 1;
+}
+
/*
* This must be called with current->sighand->siglock held.
*
@@ -1559,11 +1588,7 @@ static void ptrace_stop(int exit_code, i
spin_unlock_irq(¤t->sighand->siglock);
try_to_freeze();
read_lock(&tasklist_lock);
- if (likely(current->ptrace & PT_PTRACED) &&
- likely(current->parent != current->real_parent ||
- !(current->ptrace & PT_ATTACHED)) &&
- (likely(current->parent->signal != current->signal) ||
- !unlikely(current->signal->flags & SIGNAL_GROUP_EXIT))) {
+ if (may_ptrace_stop()) {
do_notify_parent_cldstop(current, CLD_TRAPPED);
read_unlock(&tasklist_lock);
schedule();
--- MM/kernel/ptrace.c~1_FIX 2006-05-14 20:06:44.000000000 +0400
+++ MM/kernel/ptrace.c 2006-05-14 21:27:06.000000000 +0400
@@ -213,7 +213,9 @@ int ptrace_detach(struct task_struct *ch
ptrace_disable(child);
write_lock_irq(&tasklist_lock);
- __ptrace_detach(child, data);
+ /* protect against de_thread()->release_task() */
+ if (child->ptrace)
+ __ptrace_detach(child, data);
write_unlock_irq(&tasklist_lock);
return 0;
reply other threads:[~2006-05-14 14:45 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060514184510.GA86@oleg \
--to=oleg@tv-sign.ru \
--cc=akpm@osdl.org \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roland@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.