diff options
| author | Manjunathappa Prakash <c_pmanju@qca.qualcomm.com> | 2015-04-25 12:48:21 -0700 |
|---|---|---|
| committer | AnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com> | 2015-04-30 19:08:21 +0530 |
| commit | 8d7416de4cb5d7e88eeeaefa25abd4915751defa (patch) | |
| tree | 931a1b7de709969009a19bbfaef9e673b850ddd8 | |
| parent | b697059ad31ea63dd5f7cfaf694fb5c127a048c6 (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.c | 4 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_txrx.c | 7 |
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 |
