From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Oleg Nesterov <oleg@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Steven Rostedt <rostedt@goodmis.org>,
LKML <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@kernel.org>,
Clark Williams <williams@redhat.com>
Subject: Re: safety of *mutex_unlock() (Was: [BUG] signal: sighand unprotected when accessed by /proc)
Date: Mon, 9 Jun 2014 09:26:13 -0700 [thread overview]
Message-ID: <20140609162613.GE4581@linux.vnet.ibm.com> (raw)
In-Reply-To: <20140608130718.GA11129@redhat.com>
On Sun, Jun 08, 2014 at 03:07:18PM +0200, Oleg Nesterov wrote:
> On 06/06, Paul E. McKenney wrote:
> >
> > On Tue, Jun 03, 2014 at 10:01:25PM +0200, Oleg Nesterov wrote:
> > >
> > > I'll try to recheck rt_mutex_unlock() tomorrow. _Perhaps_ rcu_read_unlock()
> > > should be shifted from lock_task_sighand() to unlock_task_sighand() to
> > > ensure that rt_mutex_unlock() does nothihg with this memory after it
> > > makes another lock/unlock possible.
> > >
> > > But if we need this (currently I do not think so), this doesn't depend on
> > > SLAB_DESTROY_BY_RCU. And, at first glance, in this case rcu_read_unlock_special()
> > > might be wrong too.
> >
> > OK, I will bite... What did I mess up in rcu_read_unlock_special()?
> >
> > This function does not report leaving the RCU read-side critical section
> > until after its call to rt_mutex_unlock() has returned, so any RCU
> > read-side critical sections in rt_mutex_unlock() will be respected.
>
> Sorry for confusion.
>
> I only meant that afaics rcu_read_unlock_special() equally depends on the
> fact that rt_mutex_unlock() does nothing with "struct rt_mutex" after it
> makes another rt_mutex_lock() + rt_mutex_unlock() possible, otherwise this
> code is wrong (and unlock_task_sighand() would be wrong too).
>
> Just to simplify the discussion... suppose we add "atomic_t nr_slow_unlock"
> into "struct rt_mutex" and change rt_mutex_slowunlock() to do
> atomic_inc(&lock->nr_slow_unlock) after it drops ->wait_lock. Of course this
> would be ugly, just for illustration.
That would indeed be a bad thing, as it could potentially lead to
use-after-free bugs. Though one could argue that any code that resulted
in use-after-free would be quite aggressive. But still...
> In this case atomic_inc() above can write to rcu_boost()'s stack after this
> functions returns to the caller. And unlock_task_sighand() would be wrong
> too, atomic_inc() could write to the memory which was already returned to
> system because "unlock" path runs outside of rcu-protected section.
>
> But it seems to me that currently we are safe, rt_mutex_unlock() doesn't do
> something like this, a concurrent rt_mutex_lock() must always take wait_lock
> too.
>
>
> And while this is off-topic and I can be easily wrong, it seems that the
> normal "struct mutex" is not safe in this respect. If nothing else, once
> __mutex_unlock_common_slowpath()->__mutex_slowpath_needs_to_unlock() sets
> lock->count = 1, a concurent mutex_lock() can take and then release this
> mutex before __mutex_unlock_common_slowpath() takes ->wait_lock.
>
> So _perhaps_ we should not rely on this property of rt_mutex "too much".
Well, I could easily move the rt_mutex from rcu_boost()'s stack to the
rcu_node structure, if that would help. That said, I still have my
use-after-free concern above.
Thanx, Paul
next prev parent reply other threads:[~2014-06-09 16:26 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-03 17:02 [BUG] signal: sighand unprotected when accessed by /proc Steven Rostedt
2014-06-03 17:26 ` Oleg Nesterov
2014-06-03 18:03 ` Linus Torvalds
2014-06-03 20:01 ` Oleg Nesterov
2014-06-03 20:03 ` Oleg Nesterov
2014-06-06 20:33 ` Paul E. McKenney
2014-06-08 13:07 ` safety of *mutex_unlock() (Was: [BUG] signal: sighand unprotected when accessed by /proc) Oleg Nesterov
2014-06-09 16:26 ` Paul E. McKenney [this message]
2014-06-09 18:15 ` Oleg Nesterov
2014-06-09 18:29 ` Steven Rostedt
2014-06-09 18:51 ` Linus Torvalds
2014-06-09 19:41 ` Steven Rostedt
2014-06-10 8:53 ` Thomas Gleixner
2014-06-10 16:57 ` Oleg Nesterov
2014-06-10 18:08 ` Thomas Gleixner
2014-06-10 18:13 ` Steven Rostedt
2014-06-10 20:05 ` Thomas Gleixner
2014-06-10 20:13 ` Thomas Gleixner
2014-06-11 15:52 ` Paul E. McKenney
2014-06-11 17:07 ` Oleg Nesterov
2014-06-11 17:17 ` Oleg Nesterov
2014-06-11 17:29 ` Paul E. McKenney
2014-06-11 17:59 ` Oleg Nesterov
2014-06-11 19:56 ` Paul E. McKenney
2014-06-12 17:28 ` Oleg Nesterov
2014-06-12 20:35 ` Paul E. McKenney
2014-06-12 21:40 ` Thomas Gleixner
2014-06-12 22:27 ` Paul E. McKenney
2014-06-12 23:19 ` Paul E. McKenney
2014-06-13 15:08 ` Oleg Nesterov
2014-06-15 5:40 ` Paul E. McKenney
2014-06-17 18:57 ` Paul E. McKenney
2014-06-18 16:43 ` Oleg Nesterov
2014-06-18 16:53 ` Steven Rostedt
2014-06-21 19:54 ` Thomas Gleixner
2014-06-18 17:00 ` Paul E. McKenney
2014-06-13 14:55 ` Oleg Nesterov
2014-06-13 16:10 ` Thomas Gleixner
2014-06-13 16:19 ` Oleg Nesterov
2014-06-13 14:52 ` Oleg Nesterov
2014-06-11 17:27 ` Paul E. McKenney
2014-06-10 17:07 ` Oleg Nesterov
2014-06-10 17:51 ` Thomas Gleixner
2014-06-10 12:56 ` Paul E. McKenney
2014-06-10 14:48 ` Peter Zijlstra
2014-06-10 15:18 ` Paul E. McKenney
2014-06-10 15:35 ` Linus Torvalds
2014-06-10 16:15 ` Paul E. McKenney
2014-06-09 19:04 ` Oleg Nesterov
2014-06-10 8:37 ` Peter Zijlstra
2014-06-10 12:52 ` Paul E. McKenney
2014-06-10 13:01 ` Peter Zijlstra
2014-06-10 14:36 ` Paul E. McKenney
2014-06-10 15:20 ` Paul E. McKenney
2014-06-03 20:05 ` [BUG] signal: sighand unprotected when accessed by /proc Steven Rostedt
2014-06-03 20:09 ` Oleg Nesterov
2014-06-03 20:15 ` Steven Rostedt
2014-06-03 20:25 ` Steven Rostedt
2014-06-03 21:12 ` Thomas Gleixner
2014-06-03 18:05 ` Steven Rostedt
2014-06-03 19:25 ` Oleg Nesterov
2014-06-04 1:16 ` Steven Rostedt
2014-06-04 16:31 ` 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=20140609162613.GE4581@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=williams@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.