diff options
Diffstat (limited to 'net/mac80211/sta_info.c')
| -rw-r--r-- | net/mac80211/sta_info.c | 12 | 
1 files changed, 10 insertions, 2 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index a79ce820cb5..238a0cca320 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -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--;  |