From: Tejun Heo <tj@kernel.org>
To: Oleg Nesterov <oleg@redhat.com>
Cc: roland@redhat.com, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
rjw@sisk.pl, jan.kratochvil@redhat.com
Subject: Re: [PATCH 12/16] ptrace: make group stop notification reliable against ptrace
Date: Tue, 21 Dec 2010 18:43:23 +0100 [thread overview]
Message-ID: <20101221174319.GH13285@htj.dyndns.org> (raw)
In-Reply-To: <20101220173425.GA18070@redhat.com>
On Mon, Dec 20, 2010 at 06:34:25PM +0100, Oleg Nesterov wrote:
> On 12/06, Tejun Heo wrote:
> >
> > This patch adds a new signal flag SIGNAL_NOTIFY_STOP which is set on
> > group stop completion and cleared on notification to the real parent
> > or together with other stopped flags on SIGCONT/KILL. This guarantees
> > that the real parent is notified correctly regardless of ptrace.
>
> OK, I am a bit confused. I do not understand exactly what this
> "correctly" actually means.
It means that the ptracer wouldn't eat the notification. The
notification is buffered and delivered when ptrace detaches.
> > If a ptraced task is the last task to stop, the notification is
> > postponed till ptrace detach or canceled if SIGCONT/KILL is
> > received inbetween.
>
> OK. But what if the last task to stop is not ptraced? In this case
> ->real_parent gets the notification.
>
> Of course, the current behaviour is not better, it is obviously wrong.
> But if we want to fix things, perhaps we should invite the new and
> clear rules. Isn't it better to always notify ->real_parent when the
> last thread stops in STOPPED/TRACED state? Otherwise the behaviour is
> not predictable, it depends on task_ptrace() state of the last thead
> which sees SIGNAL_NOTIFY_STOP.
I see. My focus was to make ptrace attach/detach transparent. IOW,
minimizing the effect of a debugger (or gcore or whatever) attaching
and then leaving. So, this patch just makes sure that the
notification isn't absorbed by a ptracer.
> Actually, I think it would be even better to never notify ->real_parent
> until debugger detaches all threads, but this is not simple to implement.
But, yes, this is gonna change the behavior in subtle ways anyway so
it would be better to take care of that too.
> > @@ -1901,21 +1925,12 @@ retry:
> > __set_current_state(TASK_STOPPED);
> >
> > if (likely(!task_ptrace(current))) {
> > - int notify = 0;
> > -
> > - /*
> > - * If there are no other threads in the group, or if there
> > - * is a group stop in progress and we are the last to stop,
> > - * report to the parent.
> > - */
> > - if (task_participate_group_stop(current))
> > - notify = CLD_STOPPED;
> > -
> > + task_participate_group_stop(current);
> > spin_unlock_irq(¤t->sighand->siglock);
> >
> > - if (notify) {
> > + if (sig->flags & SIGNAL_NOTIFY_STOP) {
> > read_lock(&tasklist_lock);
> > - do_notify_parent_cldstop(current, notify);
> > + do_notify_parent_cldstop(current, CLD_STOPPED);
>
> Suppose that debugger attaches right after spin_unlock(->siglock).
>
> Nothing really bad can happen afaics, but in this case the debugger
> will be notified twice. Hmm. If the debugger does do_wait() immediately
> after the first notification, it has all rights to see the stopped
> tracee but wait_task_stopped() fails, not good.
Hmmm? ptrace_attach() can't happen while tasklist_lock is held.
Thanks.
--
tejun
next prev parent reply other threads:[~2010-12-21 17:43 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-06 16:56 [PATCHSET] ptrace,signal: sane interaction between ptrace and job control signals, take#2 Tejun Heo
2010-12-06 16:56 ` [PATCH 01/16] signal: fix SIGCONT notification code Tejun Heo
2010-12-06 16:56 ` [PATCH 02/16] signal: fix CLD_CONTINUED notification target Tejun Heo
2010-12-20 14:58 ` Oleg Nesterov
2010-12-21 16:31 ` Tejun Heo
2010-12-06 16:56 ` [PATCH 03/16] signal: remove superflous try_to_freeze() loop in do_signal_stop() Tejun Heo
2010-12-20 14:59 ` Oleg Nesterov
2010-12-06 16:56 ` [PATCH 04/16] ptrace: kill tracehook_notify_jctl() Tejun Heo
2010-12-20 14:59 ` Oleg Nesterov
2010-12-21 17:00 ` Tejun Heo
2010-12-06 16:56 ` [PATCH 05/16] ptrace: add @why to ptrace_stop() Tejun Heo
2010-12-06 16:56 ` [PATCH 06/16] signal: fix premature completion of group stop when interfered by ptrace Tejun Heo
2010-12-20 15:00 ` Oleg Nesterov
2010-12-21 17:04 ` Tejun Heo
2010-12-06 16:56 ` [PATCH 07/16] signal: use GROUP_STOP_PENDING to stop once for a single group stop Tejun Heo
2010-12-06 16:56 ` [PATCH 08/16] ptrace: participate in group stop from ptrace_stop() iff the task is trapping for " Tejun Heo
2010-12-06 16:56 ` [PATCH 09/16] ptrace: make do_signal_stop() use ptrace_stop() if the task is being ptraced Tejun Heo
2010-12-23 12:26 ` Oleg Nesterov
2010-12-23 13:53 ` Tejun Heo
2010-12-23 16:06 ` Oleg Nesterov
2010-12-23 16:33 ` Tejun Heo
2011-01-17 22:09 ` Roland McGrath
2011-01-27 13:56 ` Tejun Heo
2011-01-28 20:30 ` Roland McGrath
2011-01-31 14:39 ` Tejun Heo
2010-12-06 16:56 ` [PATCH 10/16] ptrace: clean transitions between TASK_STOPPED and TRACED Tejun Heo
2010-12-20 15:00 ` Oleg Nesterov
2010-12-21 17:31 ` Tejun Heo
2010-12-21 17:32 ` Tejun Heo
2010-12-22 10:54 ` Tejun Heo
2010-12-22 11:39 ` Oleg Nesterov
2010-12-22 15:14 ` Tejun Heo
2010-12-22 16:00 ` Oleg Nesterov
2010-12-22 16:21 ` Tejun Heo
2010-12-06 16:56 ` [PATCH 11/16] signal: prepare for CLD_* notification changes Tejun Heo
2010-12-20 16:21 ` Oleg Nesterov
2010-12-20 16:23 ` Oleg Nesterov
2010-12-21 17:35 ` Tejun Heo
2010-12-06 16:57 ` [PATCH 12/16] ptrace: make group stop notification reliable against ptrace Tejun Heo
2010-12-20 17:34 ` Oleg Nesterov
2010-12-21 17:43 ` Tejun Heo [this message]
2010-12-22 11:54 ` Oleg Nesterov
2010-12-22 15:26 ` Tejun Heo
2010-12-22 16:02 ` Oleg Nesterov
2010-12-06 16:57 ` [PATCH 13/16] ptrace: reorganize __ptrace_unlink() and ptrace_untrace() Tejun Heo
2010-12-20 18:15 ` Oleg Nesterov
2010-12-21 17:54 ` Tejun Heo
2010-12-06 16:57 ` [PATCH 14/16] ptrace: make SIGCONT notification reliable against ptrace Tejun Heo
2010-12-20 19:43 ` Oleg Nesterov
2010-12-21 17:48 ` Tejun Heo
2010-12-22 12:16 ` Oleg Nesterov
2010-12-21 17:25 ` Oleg Nesterov
2010-12-22 10:35 ` Tejun Heo
2010-12-06 16:57 ` [PATCH 15/16] ptrace: make sure SIGNAL_NOTIFY_CONT is checked after ptrace_signal() Tejun Heo
2010-12-06 16:57 ` [PATCH 16/16] ptrace: remove the extra wake_up_process() from ptrace_detach() Tejun Heo
2010-12-07 0:10 ` Roland McGrath
2010-12-07 13:43 ` Tejun Heo
2010-12-21 17:54 ` Oleg Nesterov
2010-12-22 10:36 ` Tejun Heo
2010-12-14 17:36 ` [PATCHSET] ptrace,signal: sane interaction between ptrace and job control signals, take#2 Oleg Nesterov
2010-12-14 17:46 ` Tejun Heo
2010-12-22 15:20 ` Oleg Nesterov
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=20101221174319.GH13285@htj.dyndns.org \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=jan.kratochvil@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=rjw@sisk.pl \
--cc=roland@redhat.com \
--cc=torvalds@linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®