summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYun Park <yunp@codeaurora.org>2018-01-12 15:00:12 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-01-17 09:02:06 -0800
commite7cc594fd61aca2d47238ab1dd90636a86bb76d1 (patch)
tree2639ea121ecc5acd3a26bf425d97eb6109cef924
parenteb6337f194e11b6e490b87d62059a528e36cbdce (diff)
qcacld-3.0: Protect peer info when getting vdev by sta_id
When getting vdev by sta_id, peer could be deleted after retrieved, so garbage vdev is returned. To protect peer info, increase ref_cnt and delete peer when the ref count is 0. Change-Id: I850d38166d7c16d7f5e580baf3e0d17db22583f8 CRs-Fixed: 2171619
-rw-r--r--core/dp/txrx/ol_txrx.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index de42bfdf9025..c114b62305b0 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -104,6 +104,11 @@
#define OL_TXRX_PEER_DEC_REF_CNT_SILENT(peer) \
qdf_atomic_dec(&peer->ref_cnt)
+ol_txrx_peer_handle
+ol_txrx_peer_find_by_local_id_inc_ref(struct ol_txrx_pdev_t *pdev,
+ uint8_t local_peer_id);
+static void ol_txrx_peer_dec_ref_cnt(struct ol_txrx_peer_t *peer);
+
#if defined(CONFIG_HL_SUPPORT) && defined(FEATURE_WLAN_TDLS)
/**
@@ -323,6 +328,7 @@ void *ol_txrx_get_vdev_by_sta_id(uint8_t sta_id)
{
struct ol_txrx_peer_t *peer = NULL;
ol_txrx_pdev_handle pdev = NULL;
+ ol_txrx_vdev_handle vdev;
if (sta_id >= WLAN_MAX_STA_COUNT) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
@@ -337,14 +343,17 @@ void *ol_txrx_get_vdev_by_sta_id(uint8_t sta_id)
return NULL;
}
- peer = ol_txrx_peer_find_by_local_id(pdev, sta_id);
+ peer = ol_txrx_peer_find_by_local_id_inc_ref(pdev, sta_id);
if (!peer) {
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
"PEER [%d] not found", sta_id);
return NULL;
}
- return peer->vdev;
+ vdev = peer->vdev;
+ ol_txrx_peer_dec_ref_cnt(peer);
+
+ return vdev;
}
/**