Skip to content

Commit

Permalink
[PATCH] softmac: Fix deadlock of wx_set_essid with assoc work
Browse files Browse the repository at this point in the history
The essid wireless extension does deadlock against the assoc mutex,
as we don't unlock the assoc mutex when flushing the workqueue, which
also holds the lock.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Michael Buesch authored and John W. Linville committed Aug 6, 2007
1 parent 69dad6e commit fdc8f43
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions net/ieee80211/softmac/ieee80211softmac_wx.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev,
struct ieee80211softmac_auth_queue_item *authptr;
int length = 0;

check_assoc_again:
mutex_lock(&sm->associnfo.mutex);

/* Check if we're already associating to this or another network
* If it's another network, cancel and start over with our new network
* If it's our network, ignore the change, we're already doing it!
Expand All @@ -98,13 +98,18 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev,
cancel_delayed_work(&authptr->work);
sm->associnfo.bssvalid = 0;
sm->associnfo.bssfixed = 0;
flush_scheduled_work();
sm->associnfo.associating = 0;
sm->associnfo.associated = 0;
/* We must unlock to avoid deadlocks with the assoc workqueue
* on the associnfo.mutex */
mutex_unlock(&sm->associnfo.mutex);
flush_scheduled_work();
/* Avoid race! Check assoc status again. Maybe someone started an
* association while we flushed. */
goto check_assoc_again;
}
}


sm->associnfo.static_essid = 0;
sm->associnfo.assoc_wait = 0;

Expand Down

0 comments on commit fdc8f43

Please sign in to comment.