mac80211: properly free requested-but-not-started TX agg sessions
authorJohannes Berg <johannes.berg@intel.com>
Mon, 13 Nov 2017 10:33:55 +0000 (11:33 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 20 Nov 2017 16:01:31 +0000 (17:01 +0100)
commit33ddd81e2bd5d9970b9f01ab383ba45035fa41ee
tree8ac9805306fbd178c65b8cf42eef0bc1f19118f2
parent67bd52386125ce1159c0581cbcd2740addf33cd4
mac80211: properly free requested-but-not-started TX agg sessions

When deleting a station or otherwise tearing down all aggregation
sessions, make sure to delete requested but not yet started ones,
to avoid the following scenario:

 * session is requested, added to tid_start_tx[]
 * ieee80211_ba_session_work() runs, gets past BLOCK_BA check
 * ieee80211_sta_tear_down_BA_sessions() runs, locks &sta->ampdu_mlme.mtx,
   e.g. while deleting the station - deleting all active sessions
 * ieee80211_ba_session_work() continues since tear down flushes it, and
   calls ieee80211_tx_ba_session_handle_start() for the new session, arms
   the timer for it
 * station deletion continues to __cleanup_single_sta() and frees the
   session struct, while the timer is armed

Reported-by: Fengguang Wu <fengguang.wu@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/agg-tx.c