From: Oleg Nesterov <oleg@redhat.com>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
David Rientjes <rientjes@google.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Michal Hocko <mhocko@suse.cz>, Sergey Dyasly <dserrg@gmail.com>,
Sha Zhengju <handai.szj@taobao.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/3] proc: first_tid: fix the potential use-after-free
Date: Wed, 29 May 2013 14:30:09 +0200 [thread overview]
Message-ID: <20130529123009.GA5741@redhat.com> (raw)
In-Reply-To: <877gii2zt3.fsf@xmission.com>
On 05/28, Eric W. Biederman wrote:
>
> Oleg Nesterov <oleg@redhat.com> writes:
>
> > proc_task_readdir() verifies that the result of get_proc_task()
> > is pid_alive() and thus its ->group_leader is fine too. However
> > this is not necessarily true after rcu_read_unlock(), we need
> > to recheck this after first_tid() does rcu_read_lock() again.
>
> I agree with you but you are missing something critical from your
> explanation. If a process has been passed through __unhash_process
> then task->thread_group.next (aka next_thread) returns a pointer to the
> process that was it's next thread in the thread group. Importantly
> that pointer is only guaranteed to point to valid memory until the rcu
> grace period expires.
I tried to explain this below, in 1-4 steps... But OK, agreed, this
should be explained more clearly.
I'll update the changelog.
> > Note that we need 2. and 3. only because of get_nr_threads() check,
> > and this check was supposed to be optimization only.
>
> An optimization and denial of service attack prevention. It keeps us
> spinning for nearly unbounded amounts of time in the rcu critical
> section.
I do not really think we need this check to prevent the DoS attacks.
The main loop does while_each_thread(), so it will stop after
nr_threads iterations. And a user can always do llseek to trigger
the "full" scan.
But this is off-topic, and
> But I agree it should not be needed from this part of
> correctness.
Yes.
> >
> > - /* If nr exceeds the number of threads there is nothing todo */
> > pos = NULL;
> > + /* If nr exceeds the number of threads there is nothing todo */
>
> Moving the comment is just noise and makes for confusing reading of your
> patch.
Well, I think this makes the code look a bit better. Without this change
the code will be
/* If nr exceeds the number of threads there is nothing todo */
pos = NULL;
if (nr && nr >= get_nr_threads(leader))
goto out;
/* It could be unhashed before we take rcu lock */
if (!pid_alive(leader))
goto out;
and the comments explaining the checks are not "simmetrical". But I won't
argue, I'll update the patch and remove it. 3/3 changes this code anyway.
Oleg.
next prev parent reply other threads:[~2013-05-29 12:34 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-27 20:27 [PATCH 0/3] proc: first_tid() fix/cleanup Oleg Nesterov
2013-05-27 20:28 ` [PATCH 1/3] proc: first_tid: fix the potential use-after-free Oleg Nesterov
2013-05-29 4:08 ` Eric W. Biederman
2013-05-29 12:30 ` Oleg Nesterov [this message]
2013-05-27 20:28 ` [PATCH 2/3] proc: change first_tid() to use while_each_thread() Oleg Nesterov
2013-05-27 20:28 ` [PATCH 3/3] proc: simplify proc_task_readdir/first_tid paths Oleg Nesterov
2013-05-29 4:42 ` Eric W. Biederman
2013-05-29 13:39 ` Oleg Nesterov
2013-05-29 20:38 ` Eric W. Biederman
2013-05-31 16:38 ` Oleg Nesterov
2013-05-31 18:12 ` Eric W. Biederman
2013-05-31 18:34 ` Oleg Nesterov
2013-05-29 5:22 ` [PATCH 0/3] proc: first_tid() fix/cleanup Eric W. Biederman
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=20130529123009.GA5741@redhat.com \
--to=oleg@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=dserrg@gmail.com \
--cc=ebiederm@xmission.com \
--cc=handai.szj@taobao.com \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mhocko@suse.cz \
--cc=rientjes@google.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.