Skip to content

Commit 3bd5359

Browse files
greearbgregkh
authored andcommitted
mac80211: Fix crash due to un-canceled work-items
commit 4992185 upstream. Some mlme work structs are not cancelled on disassociation nor interface deletion, which leads to them running after the memory has been freed There is not a clean way to cancel these in the disassociation logic because they must be canceled outside of the ifmgd->mtx lock, so just cancel them in mgd_stop logic that tears down the station. This fixes the crashes we see in 3.7.9+. The crash stack trace itself isn't so helpful, but this warning gives more useful info: WARNING: at /home/greearb/git/linux-3.7.dev.y/lib/debugobjects.c:261 debug_print_object+0x7c/0x8d() ODEBUG: free active (active state 0) object type: work_struct hint: ieee80211_sta_monitor_work+0x0/0x14 [mac80211] Modules linked in: [...] Pid: 14743, comm: iw Tainted: G C O 3.7.9+ #11 Call Trace: [<ffffffff81087ef8>] warn_slowpath_common+0x80/0x98 [<ffffffff81087fa4>] warn_slowpath_fmt+0x41/0x43 [<ffffffff812a2608>] debug_print_object+0x7c/0x8d [<ffffffff812a2bca>] debug_check_no_obj_freed+0x95/0x1c3 [<ffffffff8114cc69>] slab_free_hook+0x70/0x79 [<ffffffff8114ea3e>] kfree+0x62/0xb7 [<ffffffff8149f465>] netdev_release+0x39/0x3e [<ffffffff8136ad67>] device_release+0x52/0x8a [<ffffffff812937db>] kobject_release+0x121/0x158 [<ffffffff81293612>] kobject_put+0x4c/0x50 [<ffffffff8148f0d7>] netdev_run_todo+0x25c/0x27e Signed-off-by: Ben Greear <[email protected]> Signed-off-by: Johannes Berg <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 0a1710d commit 3bd5359

File tree

1 file changed

+11
-0
lines changed

1 file changed

+11
-0
lines changed

net/mac80211/mlme.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4072,6 +4072,17 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
40724072
{
40734073
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
40744074

4075+
/*
4076+
* Make sure some work items will not run after this,
4077+
* they will not do anything but might not have been
4078+
* cancelled when disconnecting.
4079+
*/
4080+
cancel_work_sync(&ifmgd->monitor_work);
4081+
cancel_work_sync(&ifmgd->beacon_connection_loss_work);
4082+
cancel_work_sync(&ifmgd->request_smps_work);
4083+
cancel_work_sync(&ifmgd->csa_connection_drop_work);
4084+
cancel_work_sync(&ifmgd->chswitch_work);
4085+
40754086
mutex_lock(&ifmgd->mtx);
40764087
if (ifmgd->assoc_data)
40774088
ieee80211_destroy_assoc_data(sdata, false);

0 commit comments

Comments
 (0)