forked from Minki/linux
iwlwifi: mvm: fix a NULL pointer dereference of error in recovery
Sometimes, we can have an firmware crash while trying to
recover from a previous firmware problem.
When that happens, lots of things can go wrong. For example
the stations don't get added properly to mvm->fw_id_to_mac_id.
Mac80211 tries to stop A-MPDU upon reconfig but in case of
a firmware crash we will bail out fairly early and in the
end, we won't delete the A-MPDU Rx timeout.
When that timer expired after a double firmware crash,
we end up dereferencing mvm->fw_id_to_mac_id[sta_id]
which is NULL.
Fixes: 10b2b2019d
("iwlwifi: mvm: add infrastructure for tracking BA session in driver")
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
f6eac740a9
commit
61dd8a8a6a
@ -277,6 +277,18 @@ static void iwl_mvm_rx_agg_session_expired(unsigned long data)
|
||||
|
||||
/* Timer expired */
|
||||
sta = rcu_dereference(ba_data->mvm->fw_id_to_mac_id[ba_data->sta_id]);
|
||||
|
||||
/*
|
||||
* sta should be valid unless the following happens:
|
||||
* The firmware asserts which triggers a reconfig flow, but
|
||||
* the reconfig fails before we set the pointer to sta into
|
||||
* the fw_id_to_mac_id pointer table. Mac80211 can't stop
|
||||
* A-MDPU and hence the timer continues to run. Then, the
|
||||
* timer expires and sta is NULL.
|
||||
*/
|
||||
if (!sta)
|
||||
goto unlock;
|
||||
|
||||
mvm_sta = iwl_mvm_sta_from_mac80211(sta);
|
||||
ieee80211_stop_rx_ba_session_offl(mvm_sta->vif,
|
||||
sta->addr, ba_data->tid);
|
||||
|
Loading…
Reference in New Issue
Block a user