|
@@ -193,6 +193,7 @@ void ieee80211_if_reinit(struct net_device *dev)
|
|
|
/* Remove all virtual interfaces that use this BSS
|
|
|
* as their sdata->bss */
|
|
|
struct ieee80211_sub_if_data *tsdata, *n;
|
|
|
+ struct beacon_data *beacon;
|
|
|
|
|
|
list_for_each_entry_safe(tsdata, n, &local->interfaces, list) {
|
|
|
if (tsdata != sdata && tsdata->bss == &sdata->u.ap) {
|
|
@@ -210,7 +211,10 @@ void ieee80211_if_reinit(struct net_device *dev)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- kfree(sdata->u.ap.beacon);
|
|
|
+ beacon = sdata->u.ap.beacon;
|
|
|
+ rcu_assign_pointer(sdata->u.ap.beacon, NULL);
|
|
|
+ synchronize_rcu();
|
|
|
+ kfree(beacon);
|
|
|
|
|
|
while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) {
|
|
|
local->total_ps_buffered--;
|