summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@codeaurora.org>2017-09-28 17:41:35 -0700
committersnandini <snandini@codeaurora.org>2017-09-29 17:29:27 -0700
commit310e284dac74807aaefd2acd78e7ceb9088617b3 (patch)
tree83073f38bb64d15ceb6df6268548aea1e15d8629
parent9dd946a525d5048fb18ee433809b327039ebebfa (diff)
qcacld-3.0: Set hdd context to null when its freed
HDD context in gp_cds_context is not getting reset to null during driver remove callback when hdd context is destroyed. Set HDD context to null to avoid any use after free. Change-Id: Ifbeaca139ed44f871266a11f4b9e973961e26cc8 CRs-Fixed: 2119187
-rw-r--r--core/cds/src/cds_api.c3
-rw-r--r--core/hdd/src/wlan_hdd_main.c5
2 files changed, 6 insertions, 2 deletions
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index 4a9e4c1636ac..27737e628eb5 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -1358,6 +1358,9 @@ QDF_STATUS cds_set_context(QDF_MODULE_ID module_id, void *context)
case QDF_MODULE_ID_HIF:
p_cds_context->pHIFContext = context;
break;
+ case QDF_MODULE_ID_HDD:
+ p_cds_context->pHDDContext = context;
+ break;
default:
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
"%s: Module ID %i does not have its context managed by CDS",
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index e23f2b1bbbce..795d138e748a 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -5735,6 +5735,7 @@ static int hdd_context_deinit(hdd_context_t *hdd_ctx)
*/
static void hdd_context_destroy(hdd_context_t *hdd_ctx)
{
+ cds_set_context(QDF_MODULE_ID_HDD, NULL);
wlan_hdd_deinit_tx_rx_histogram(hdd_ctx);
@@ -7838,8 +7839,6 @@ static hdd_context_t *hdd_context_create(struct device *dev)
hdd_override_ini_config(hdd_ctx);
- ((cds_context_type *) (p_cds_context))->pHDDContext = (void *)hdd_ctx;
-
ret = hdd_context_init(hdd_ctx);
if (ret)
@@ -7868,6 +7867,8 @@ static hdd_context_t *hdd_context_create(struct device *dev)
if (cds_is_multicast_logging())
wlan_logging_set_log_level();
+ cds_set_context(QDF_MODULE_ID_HDD, hdd_ctx);
+
skip_multicast_logging:
hdd_set_trace_level_for_each(hdd_ctx);