summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNitesh Shah <niteshs@codeaurora.org>2017-01-31 16:58:18 +0530
committerqcabuildsw <qcabuildsw@localhost>2017-03-03 16:34:57 -0800
commitd2c6d01bf764cc1937120d39cfe1eb542fc1c3f1 (patch)
tree5e83c7d813d59d8a985ad0d96fe49ac033fb0096
parenta00e08accafebf3d0606d7f06df1a1950e388672 (diff)
qcacld-3.0: Acquire mutex before accessing tdls function
peer_list is a parameter for tdls_ctx, so every access to peer_list should be protected with mutex lock. This change refactors the code for function wlan_hdd_tdls_discovery_timeout_peer_cb() and wlan_hdd_tdls_scan_callback(). Change-Id: I6927aee62c726edd1944d3b6638ae68d9c91d6ab CRs-Fixed: 1106235
-rw-r--r--core/hdd/src/wlan_hdd_tdls.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c
index 8d7fb445d79a..3c4ef161ce28 100644
--- a/core/hdd/src/wlan_hdd_tdls.c
+++ b/core/hdd/src/wlan_hdd_tdls.c
@@ -396,9 +396,21 @@ static void wlan_hdd_tdls_discovery_timeout_peer_cb(void *userData)
struct list_head *pos, *q;
tdlsCtx_t *pHddTdlsCtx;
hdd_context_t *pHddCtx;
+ v_CONTEXT_t cds_context;
ENTER();
+ cds_context = cds_get_global_context();
+ if (NULL == cds_context) {
+ hdd_err("cds_context points to NULL");
+ return;
+ }
+
+ pHddCtx = cds_get_context(QDF_MODULE_ID_HDD);
+ if (0 != (wlan_hdd_validate_context(pHddCtx)))
+ return;
+
+ mutex_lock(&pHddCtx->tdls_lock);
pHddTdlsCtx = (tdlsCtx_t *) userData;
if ((NULL == pHddTdlsCtx) || (NULL == pHddTdlsCtx->pAdapter)) {
@@ -412,25 +424,17 @@ static void wlan_hdd_tdls_discovery_timeout_peer_cb(void *userData)
return;
}
- pHddCtx = WLAN_HDD_GET_CTX(pHddTdlsCtx->pAdapter);
- if (0 != (wlan_hdd_validate_context(pHddCtx)))
- return;
-
- mutex_lock(&pHddCtx->tdls_lock);
-
for (i = 0; i < TDLS_PEER_LIST_SIZE; i++) {
head = &pHddTdlsCtx->peer_list[i];
list_for_each_safe(pos, q, head) {
tmp = list_entry(pos, hddTdlsPeer_t, node);
if (eTDLS_LINK_DISCOVERING == tmp->link_status) {
- mutex_unlock(&pHddCtx->tdls_lock);
hdd_notice(MAC_ADDRESS_STR " to idle state",
MAC_ADDR_ARRAY(tmp->peerMac));
wlan_hdd_tdls_set_peer_link_status(tmp,
eTDLS_LINK_IDLE,
eTDLS_LINK_NOT_SUPPORTED,
- true);
- mutex_lock(&pHddCtx->tdls_lock);
+ false);
}
}
}
@@ -2877,7 +2881,8 @@ int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
if (eTDLS_SUPPORT_NOT_ENABLED == pHddCtx->tdls_mode)
return 1;
- curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, true);
+ mutex_lock(&pHddCtx->tdls_lock);
+ curr_peer = wlan_hdd_tdls_is_progress(pHddCtx, NULL, 0, false);
if (NULL != curr_peer) {
if (pHddCtx->tdls_scan_ctxt.reject++ >= TDLS_MAX_SCAN_REJECT) {
pHddCtx->tdls_scan_ctxt.reject = 0;
@@ -2889,13 +2894,16 @@ int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
wlan_hdd_tdls_set_peer_link_status(curr_peer,
eTDLS_LINK_IDLE,
eTDLS_LINK_UNSPECIFIED,
- true);
+ false);
+ mutex_unlock(&pHddCtx->tdls_lock);
return 1;
}
+ mutex_unlock(&pHddCtx->tdls_lock);
hdd_warn("tdls in progress. scan rejected %d",
pHddCtx->tdls_scan_ctxt.reject);
return -EBUSY;
}
+ mutex_unlock(&pHddCtx->tdls_lock);
/* tdls teardown is ongoing */
if (eTDLS_SUPPORT_DISABLED == pHddCtx->tdls_mode) {