summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManjunathappa Prakash <c_pmanju@qca.qualcomm.com>2015-04-25 12:48:21 -0700
committerAnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com>2015-04-30 19:08:21 +0530
commit8d7416de4cb5d7e88eeeaefa25abd4915751defa (patch)
tree931a1b7de709969009a19bbfaef9e673b850ddd8
parentb697059ad31ea63dd5f7cfaf694fb5c127a048c6 (diff)
qcacld-new: protect and serialize the access to peer
Protect and serialize access peer pointer in ol_txrx_peer_find_by_local_id so that we do not get the peer which is being freed or deleted. Change-Id: Ib59c02f0c42c3c4f287a4c9da93abeab2b82dcf9 CRs-Fixed: 828359
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c4
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx.c7
2 files changed, 9 insertions, 2 deletions
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 4ed9c05bc17f..c335eae90918 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -1584,7 +1584,9 @@ VOS_STATUS WLANTL_ChangeSTAState(void *vos_ctx, u_int8_t sta_id,
peer = ol_txrx_peer_find_by_local_id(
((pVosContextType) vos_ctx)->pdev_txrx_ctx,
sta_id);
- if (!peer)
+
+ if ((peer == NULL) ||
+ (adf_os_atomic_read(&peer->delete_in_progress) == 1))
return VOS_STATUS_E_FAULT;
if (sta_state == WLANTL_STA_CONNECTED)
diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c
index 1d74933684c2..ff85ca21b600 100644
--- a/CORE/CLD_TXRX/TXRX/ol_txrx.c
+++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c
@@ -153,11 +153,16 @@ ol_txrx_peer_find_by_local_id(
struct ol_txrx_pdev_t *pdev,
u_int8_t local_peer_id)
{
+ struct ol_txrx_peer_t *peer;
if ((local_peer_id == OL_TXRX_INVALID_LOCAL_PEER_ID) ||
(local_peer_id >= OL_TXRX_NUM_LOCAL_PEER_IDS)) {
return NULL;
}
- return pdev->local_peer_ids.map[local_peer_id];
+
+ adf_os_spin_lock_bh(&pdev->local_peer_ids.lock);
+ peer = pdev->local_peer_ids.map[local_peer_id];
+ adf_os_spin_unlock_bh(&pdev->local_peer_ids.lock);
+ return peer;
}
static void