forked from mirrors/linux
		
	wifi: cfg80211: cancel wiphy_work before freeing wiphy
A wiphy_work can be queued from the moment the wiphy is allocated and
initialized (i.e. wiphy_new_nm). When a wiphy_work is queued, the
rdev::wiphy_work is getting queued.
If wiphy_free is called before the rdev::wiphy_work had a chance to run,
the wiphy memory will be freed, and then when it eventally gets to run
it'll use invalid memory.
Fix this by canceling the work before freeing the wiphy.
Fixes: a3ee4dc84c ("wifi: cfg80211: add a work abstraction with special semantics")
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Link: https://patch.msgid.link/20250306123626.efd1d19f6e07.I48229f96f4067ef73f5b87302335e2fd750136c9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
			
			
This commit is contained in:
		
							parent
							
								
									9a267ce4a3
								
							
						
					
					
						commit
						72d520476a
					
				
					 1 changed files with 7 additions and 0 deletions
				
			
		|  | @ -1191,6 +1191,13 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev) | |||
| { | ||||
| 	struct cfg80211_internal_bss *scan, *tmp; | ||||
| 	struct cfg80211_beacon_registration *reg, *treg; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&rdev->wiphy_work_lock, flags); | ||||
| 	WARN_ON(!list_empty(&rdev->wiphy_work_list)); | ||||
| 	spin_unlock_irqrestore(&rdev->wiphy_work_lock, flags); | ||||
| 	cancel_work_sync(&rdev->wiphy_work); | ||||
| 
 | ||||
| 	rfkill_destroy(rdev->wiphy.rfkill); | ||||
| 	list_for_each_entry_safe(reg, treg, &rdev->beacon_registrations, list) { | ||||
| 		list_del(®->list); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Miri Korenblit
						Miri Korenblit