mac80211: always synchronize_net() during station removal
If there are keys left during station removal, then a synchronize_net() will be done (for each key, I have a patch to address this for 3.10), otherwise it won't be done at all which causes issues because the station could be used for TX while it's being removed from the driver -- that might confuse the driver. Fix this by always doing synchronize_net() if no key was present any more. Cc: stable@vger.kernel.org Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
801d929ca7
commit
27a737ff7c
@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(struct sta_info *sta)
|
||||
struct ieee80211_local *local;
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int ret, i;
|
||||
bool have_key = false;
|
||||
|
||||
might_sleep();
|
||||
|
||||
@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(struct sta_info *sta)
|
||||
list_del_rcu(&sta->list);
|
||||
|
||||
mutex_lock(&local->key_mtx);
|
||||
for (i = 0; i < NUM_DEFAULT_KEYS; i++)
|
||||
for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
|
||||
__ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i]));
|
||||
if (sta->ptk)
|
||||
have_key = true;
|
||||
}
|
||||
if (sta->ptk) {
|
||||
__ieee80211_key_free(key_mtx_dereference(local, sta->ptk));
|
||||
have_key = true;
|
||||
}
|
||||
mutex_unlock(&local->key_mtx);
|
||||
|
||||
if (!have_key)
|
||||
synchronize_net();
|
||||
|
||||
sta->dead = true;
|
||||
|
||||
local->num_sta--;
|
||||
|
Loading…
Reference in New Issue
Block a user