From: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Ingo Molnar <mingo@elte.hu>, Anton Arapov <anton@redhat.com>,
"Frank Ch. Eigler" <fche@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
William Cohen <wcohen@redhat.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] uprobes: mmap_region() corrupts mm->mm_rb if uprobe_mmap() fails
Date: Tue, 31 Jul 2012 12:17:30 +0530 [thread overview]
Message-ID: <20120731064730.GB5087@linux.vnet.ibm.com> (raw)
In-Reply-To: <20120728163157.GA22719@redhat.com>
>
> If mmap_region()->uprobe_mmap() fails, unmap_and_free_vma path
> does unmap_region() but does not remove the soon-to-be-freed vma
> from rb tree (actually there are more problems).
>
> Perhaps we could do do_munmap() + return in this case, but in fact
> it is simply wrong to abort if uprobe_mmap() fails. Until at least
> we move the !UPROBE_COPY_INSN code from install_breakpoint() to
> uprobe_register().
>
> For example, uprobe_mmap()->install_breakpoint() can fail if the
> probed insn is not supported (remember, uprobe_register() succeeds
> if nobody mmaps inode/offset), mmap() should not fail in this case.
>
> dup_mmap()->uprobe_mmap() is wrong too by the same reason, fork()
> can race with uprobe_register() and fail for no reason if it wins
> the race and does install_breakpoint() first.
>
> Change mmap_region() and dup_mmap() to ignore the error code from
> uprobe_mmap().
>
> Reported-by: William Cohen <wcohen@redhat.com>
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> Cc: <stable@vger.kernel.org> # v3.5
> ---
> kernel/fork.c | 4 ++--
> mm/mmap.c | 5 ++---
> 2 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/fork.c b/kernel/fork.c
> index ab5211b..54bb88a 100644
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -454,8 +454,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
> if (retval)
> goto out;
>
> - if (file && uprobe_mmap(tmp))
> - goto out;
> + if (file)
> + uprobe_mmap(tmp);
I am not comfortable with this fix.
Lets say there were 10 probes that were to be installed in that vma.
we were able to install five probes and the 6th one happened to fail
because of invalid instruction; we dont continue with the registering
probes for the remaining 4 probes.
Your fix allows probe hits for 5 registered probes that can lead to
misleading analysis. For example if one of the first five probes was a
malloc and the probe at free() was one of the last probes which wasnt
registered, then a person doing an analysis based on probes can say
there was a memory leak.
The intention behind failing mmap()/fork() if uprobe_mmap failed,
was to make sure that we always report the correct number of events.
Infact this was something that Peter advocated very strongly
http://article.gmane.org/gmane.linux.kernel.mm/59956
I think the long term solution is as you mentioned, move the
instruction analysis to register.
Till then should we just ignore invalid instruction probes similar to
existing probes. i.e we return -ESRCH or some such which is ignored in
uprobe_mmap(), but is taken care of in the uprobe_register path.
The above may not be an elegant solution but..
--
thanks and regards
Srikar
next prev parent reply other threads:[~2012-07-31 6:47 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-07-28 16:31 [PATCH] uprobes: mmap_region() corrupts mm->mm_rb if uprobe_mmap() fails Oleg Nesterov
2012-07-28 16:34 ` Oleg Nesterov
2012-07-30 13:22 ` William Cohen
2012-07-31 6:47 ` Srikar Dronamraju [this message]
2012-07-31 12:48 ` Oleg Nesterov
2012-07-31 13:25 ` Oleg Nesterov
2012-08-02 10:05 ` [PATCH] uprobes: Ignore unsupported instructions in uprobe_mmap Srikar Dronamraju
2012-08-02 13:53 ` Oleg Nesterov
2012-08-02 16:42 ` Srikar Dronamraju
2012-08-02 17:48 ` Oleg Nesterov
2012-08-03 12:13 ` Srikar Dronamraju
2012-08-03 13:38 ` Oleg Nesterov
2012-08-02 14:17 ` Oleg Nesterov
2012-08-02 16:54 ` Srikar Dronamraju
2012-08-02 17:53 ` Oleg Nesterov
2012-08-03 1:20 ` Srikar Dronamraju
2012-08-03 13:47 ` Oleg Nesterov
2012-08-03 17:46 ` [PATCH] uprobes: mmap_region() corrupts mm->mm_rb if uprobe_mmap() fails Srikar Dronamraju
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=20120731064730.GB5087@linux.vnet.ibm.com \
--to=srikar@linux.vnet.ibm.com \
--cc=anton@redhat.com \
--cc=fche@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=wcohen@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).