summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnson <jjohnson@qca.qualcomm.com>2013-12-05 17:19:46 -0800
committerPrakash Dhavali <pdhavali@codeaurora.org>2014-01-18 02:43:13 -0800
commit32bf1d22fea19da48e6f3e30eb88f9b226f5638f (patch)
tree331dedf6c9c9a8a0d055a7e4ec2f3fc6ab940d23
parent3ab487efb84f31d09a173a825d1866d5cbdd17e3 (diff)
wlan: Add adapter MAGIC checking in *_tx_fetch_packet_cbk()
A kernel panic in _list_del_entry() was observed when SoftAP was disabled. Root cause is that when the SoftAP function was disabled and the pAdapter was freed, the TX Thread was blocked. When the TX Thread subsequently unblocked, a stale pAdapter was dereferenced. Add adapter MAGIC checking to the *_tx_fetch_packet_cbk() functions to prevent dereference of a stale pAdapter. Change-Id: I7d7436bf0433e86833230b8bfa620a8fa9c7f538 CRs-fixed: 580814
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c34
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c2
2 files changed, 18 insertions, 18 deletions
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index e909b2d69f33..7d269b724701 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -1103,13 +1103,28 @@ VOS_STATUS hdd_softap_tx_fetch_packet_cbk( v_VOID_t *vosContext,
return VOS_STATUS_E_FAILURE;
}
- pAdapter = pHddCtx->sta_to_adapter[*pStaId];
- if( NULL == pAdapter )
+ STAId = *pStaId;
+ if (STAId >= WLAN_MAX_STA_COUNT)
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
+ "%s: Invalid STAId %d passed by TL", __func__, STAId);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ pAdapter = pHddCtx->sta_to_adapter[STAId];
+ if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
{
VOS_ASSERT(0);
return VOS_STATUS_E_FAILURE;
}
+ if (FALSE == pAdapter->aStaInfo[STAId].isUsed )
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
+ "%s: Unregistered STAId %d passed by TL", __func__, STAId);
+ return VOS_STATUS_E_FAILURE;
+ }
+
/* Monitor traffic */
if ( pHddCtx->cfg_ini->enableTrafficMonitor )
{
@@ -1132,21 +1147,6 @@ VOS_STATUS hdd_softap_tx_fetch_packet_cbk( v_VOID_t *vosContext,
++pAdapter->hdd_stats.hddTxRxStats.txFetched;
- STAId = *pStaId;
- if (STAId >= WLAN_MAX_STA_COUNT)
- {
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
- "%s: Invalid STAId %d passed by TL", __func__, STAId);
- return VOS_STATUS_E_FAILURE;
- }
-
- if (FALSE == pAdapter->aStaInfo[STAId].isUsed )
- {
- VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_ERROR,
- "%s: Unregistered STAId %d passed by TL", __func__, STAId);
- return VOS_STATUS_E_FAILURE;
- }
-
*ppVosPacket = NULL;
//Make sure the AC being asked for is sane
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index f57be8db267c..f9fcd0a9b4c9 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -1304,7 +1304,7 @@ VOS_STATUS hdd_tx_fetch_packet_cbk( v_VOID_t *vosContext,
}
pAdapter = pHddCtx->sta_to_adapter[*pStaId];
- if( NULL == pAdapter )
+ if ((NULL == pAdapter) || (WLAN_HDD_ADAPTER_MAGIC != pAdapter->magic))
{
VOS_ASSERT(0);
return VOS_STATUS_E_FAILURE;