From: Frederic Weisbecker <fweisbec@gmail.com>
To: Will Deacon <will.deacon@arm.com>
Cc: LKML <linux-kernel@vger.kernel.org>, Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Prasad <prasad@linux.vnet.ibm.com>,
Paul Mundt <lethal@linux-sh.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
"v2.6.33.." <stable@kernel.org>
Subject: Re: [PATCH 1/5] ptrace: Prepare to fix racy accesses on task breakpoints
Date: Tue, 12 Apr 2011 19:54:41 +0200 [thread overview]
Message-ID: <20110412175437.GC2240@nowhere> (raw)
In-Reply-To: <1302518877.24286.34.camel@e102144-lin.cambridge.arm.com>
On Mon, Apr 11, 2011 at 11:47:57AM +0100, Will Deacon wrote:
> Hi Frederic,
>
> On Fri, 2011-04-08 at 18:34 +0100, Frederic Weisbecker wrote:
> > When a task is traced and is in a stopped state, the tracer
> > may execute a ptrace request to examine the tracee state and
> > get its task struct. Right after, the tracee can be killed
> > and thus its breakpoints released.
> > This can happen concurrently when the tracer is in the middle
> > of reading or modifying these breakpoints, leading to dereferencing
> > a freed pointer.
>
> Oo, that's nasty. Would an alternative solution be to free the
> breakpoints only when the task_struct usage count is zero?
Yeah my solution may look a bit gross. But the problem is
that perf events hold a ref on their task context. Thus the
task_struct usage will never be 0 until you release all the
perf events attached to it.
Normal perf events are released in two ways in the exit path:
- explicitly if they are inherited
- from the file release path if they are a parent
Now breakpoints are a bit specific because neither are they inherited,
nor do they have a file associated.
So we need to release them explicitly to release the task. And after that
we also need to ensure nobody will play with the breakpoints, otherwise there
will be a memory leak because those will never be freed.
So that patch protects against concurrent release of the breakpoints and
also against the possible memory leak.
May be we can think about a solution that involves not taking a ref
to the task when we allocate breakpoints, and then finally release
from the task_struct rcu release. But that may involve many corner
cases. Perhaps we can think about this later and for now opt for the
current solution that looks safe and without surprise. This fix needs
to be backported so it should stay KISS I think.
> > diff --git a/kernel/ptrace.c b/kernel/ptrace.c
> > index 0fc1eed..dc7ab65 100644
> > --- a/kernel/ptrace.c
> > +++ b/kernel/ptrace.c
> > @@ -22,6 +22,7 @@
> > #include <linux/syscalls.h>
> > #include <linux/uaccess.h>
> > #include <linux/regset.h>
> > +#include <linux/hw_breakpoint.h>
> >
> >
> > /*
> > @@ -879,3 +880,19 @@ asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
> > return ret;
> > }
> > #endif /* CONFIG_COMPAT */
> > +
> > +#ifdef CONFIG_HAVE_HW_BREAKPOINT
> > +int ptrace_get_breakpoints(struct task_struct *tsk)
> > +{
> > + if (atomic_inc_not_zero(&tsk->ptrace_bp_refcnt))
> > + return 0;
> > +
> > + return -1;
> > +}
>
>
> Would it be better to return -ESRCH here instead?
So I'm going to be nitpicking there :)
The ptrace_get_breakpoints() function tells us whether
we can take a ref on the breakpoints or not.
Returning -ERSCH there would mean that the task struct doesn't exist,
or something confusing like this. Which is not true: the task exists.
OTOH, the caller, which is ptrace, needs to take a decision when he
can't take a reference to the breakpoints. The behaviour is
to act as if the process does not exist anymore, which is about to
happen for real but we anticipate because the task has reached a
state in its exiting path where we can't manipulate the breakpoints
anymore.
So the rationale behind it is that -ERSCH is an interpretation
of the caller.
Right?
next prev parent reply other threads:[~2011-04-12 17:54 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-08 17:34 [PATCH 0/5] hw_breakpoints: Fix racy ptrace breakpoint acccesses Frederic Weisbecker
2011-04-08 17:34 ` [PATCH 1/5] ptrace: Prepare to fix racy accesses on task breakpoints Frederic Weisbecker
2011-04-11 10:47 ` Will Deacon
2011-04-12 17:54 ` Frederic Weisbecker [this message]
2011-04-13 14:34 ` Will Deacon
2011-04-13 15:10 ` Frederic Weisbecker
2011-04-25 17:37 ` Frederic Weisbecker
2011-05-04 20:28 ` [tip:perf/urgent] " tip-bot for Frederic Weisbecker
2011-04-08 17:34 ` [PATCH 2/5] x86, hw_breakpoints: Fix racy access to ptrace breakpoints Frederic Weisbecker
2011-05-04 20:28 ` [tip:perf/urgent] " tip-bot for Frederic Weisbecker
2011-04-08 17:34 ` [PATCH 3/5] powerpc, " Frederic Weisbecker
2011-04-22 13:16 ` Frederic Weisbecker
2011-04-24 8:04 ` K.Prasad
2011-05-04 20:29 ` [tip:perf/urgent] " tip-bot for Frederic Weisbecker
2011-04-08 17:34 ` [PATCH 4/5] arm, " Frederic Weisbecker
2011-05-04 20:29 ` [tip:perf/urgent] " tip-bot for Frederic Weisbecker
2011-04-08 17:34 ` [PATCH 5/5] sh, " Frederic Weisbecker
2011-04-11 16:28 ` Paul Mundt
2011-05-04 20:30 ` [tip:perf/urgent] " tip-bot for Frederic Weisbecker
2011-04-25 16:17 ` [PATCH 0/5] hw_breakpoints: Fix racy ptrace breakpoint acccesses Frederic Weisbecker
-- strict thread matches above, loose matches on Subject: below --
2011-05-03 13:25 [GIT PULL] hw_breakpoint fixes Frederic Weisbecker
2011-05-03 13:25 ` [PATCH 1/5] ptrace: Prepare to fix racy accesses on task breakpoints Frederic Weisbecker
2011-05-04 6:31 ` Ingo Molnar
2011-05-04 18:22 ` Frederic Weisbecker
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=20110412175437.GC2240@nowhere \
--to=fweisbec@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=benh@kernel.crashing.org \
--cc=lethal@linux-sh.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=prasad@linux.vnet.ibm.com \
--cc=stable@kernel.org \
--cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox