All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stanislaw Gruszka <sgruszka@redhat.com>
To: Johannes Berg <johannes@sipsolutions.net>
Cc: linux-wireless@vger.kernel.org
Subject: Re: [RFC] mac80211: fix possible tid_rx->reorder_timer use after free
Date: Mon, 19 Mar 2012 14:40:17 +0100	[thread overview]
Message-ID: <20120319134016.GC6169@redhat.com> (raw)
In-Reply-To: <1332162188.3359.33.camel@jlt3.sipsolutions.net>

On Mon, Mar 19, 2012 at 02:03:08PM +0100, Johannes Berg wrote:
> On Mon, 2012-03-19 at 13:50 +0100, Stanislaw Gruszka wrote:
> > Is possible that we arm tid_rx->reorder_timer after del_timer_sync(). To
> > fix: first wait for RCU grace period finish and then delete timer. Timer
> > will not be armed again as rcu_dereference(sta->ampdu_mlme.tid_rx[tid])
> > will return NULL.
> > 
> > Debug object detected problem with the following warning:
> > ODEBUG: free active (active state 0) object type: timer_list hint: sta_rx_agg_reorder_timer_expired+0x0/0xf0 [mac80211]
> > 
> > Bug report (with full warning):
> > https://bugzilla.redhat.com/show_bug.cgi?id=804007
> > 
> > Reported-by: "jan p. springer" <jsd@igroup.org>
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> > ---
> >  net/mac80211/agg-rx.c   |    8 ++++----
> >  net/mac80211/sta_info.h |    1 -
> >  2 files changed, 4 insertions(+), 5 deletions(-)
> > 
> > diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
> > index 1068f66..2c1223e 100644
> > --- a/net/mac80211/agg-rx.c
> > +++ b/net/mac80211/agg-rx.c
> > @@ -43,10 +43,8 @@
> >  #include "ieee80211_i.h"
> >  #include "driver-ops.h"
> >  
> > -static void ieee80211_free_tid_rx(struct rcu_head *h)
> > +static void ieee80211_free_tid_rx(struct tid_ampdu_rx *tid_rx)
> >  {
> > -	struct tid_ampdu_rx *tid_rx =
> > -		container_of(h, struct tid_ampdu_rx, rcu_head);
> >  	int i;
> >  
> >  	for (i = 0; i < tid_rx->buf_size; i++)
> > @@ -90,10 +88,12 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
> >  		ieee80211_send_delba(sta->sdata, sta->sta.addr,
> >  				     tid, WLAN_BACK_RECIPIENT, reason);
> >  
> > +	synchronize_rcu();
> > +
> >  	del_timer_sync(&tid_rx->session_timer);
> >  	del_timer_sync(&tid_rx->reorder_timer);
> >  
> > -	call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);
> > +	ieee80211_free_tid_rx(tid_rx);
> 
> Hmmm. That synchronize_rcu() could become rather expensive. I've been
> trying to reduce our use of synchronize_rcu() now.

Expensive in what sense? Since we are in process context we are allowed
to sleep, and some other processes will run while we sleep.

> I was checking if we could move the timer deletions into
> ieee80211_free_tid_rx since call_rcu runs from another softirq, but I'm
> not really sure -- the timer softirq could be running on another CPU?

Yes. I considered using async del_timer() from rcu callback, but that
would be racy too. 

We could do rcu_dereference (and check if it is not null) just
before mod_timer(). But that will still be racy as long spin_lock
will not be used.

Stanislaw

  parent reply	other threads:[~2012-03-19 13:40 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-19 12:50 [RFC] mac80211: fix possible tid_rx->reorder_timer use after free Stanislaw Gruszka
2012-03-19 13:03 ` Johannes Berg
2012-03-19 13:07   ` Johannes Berg
2012-03-19 13:43     ` Stanislaw Gruszka
2012-03-19 13:49       ` Johannes Berg
2012-03-19 13:57         ` Stanislaw Gruszka
2012-03-19 13:40   ` Stanislaw Gruszka [this message]
2012-03-19 13:50     ` Johannes Berg

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=20120319134016.GC6169@redhat.com \
    --to=sgruszka@redhat.com \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.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 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.