summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhinav Kumar <abhikuma@codeaurora.org>2018-10-01 15:45:53 +0530
committerAbhinav Kumar <abhikuma@codeaurora.org>2018-10-01 15:46:42 +0530
commit2e869b1cdcb34ba64ea8cfcd39eafa945a8070b0 (patch)
treea3fe2316ea9344418e17556abaae363bcb2f54d8
parentec11f86855c3da4cdcba10dbeeea06e19305dac7 (diff)
qcacld-3.0: Possible use of un-initialized var while changing interface
Currently, driver calls hdd_alloc_station_adapter to initialize the completion variables for a particular adapter only if mode of interface is STA or P2P. In case when driver changes its STA + SAP mode to STA + STA mode by calling hdd_open_concurrent_interface, driver is not able to initialize init_completion variable for new STA interface. So while processing fw commands (for new STA interface) which uses completion variables, driver leads to the use of uninitialized variables issue. Create new function cmn_init_completion to initialize completion variables for all interfaces while opening the HDD adapter. Change-Id: Iae8ec1a86dd4084c9f5b39ec0d90e16182212df9 CRs-Fixed: 2288919
-rw-r--r--core/hdd/inc/wlan_hdd_tdls.h18
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c7
-rw-r--r--core/hdd/src/wlan_hdd_main.c59
-rw-r--r--core/hdd/src/wlan_hdd_tdls.c8
4 files changed, 60 insertions, 32 deletions
diff --git a/core/hdd/inc/wlan_hdd_tdls.h b/core/hdd/inc/wlan_hdd_tdls.h
index 4c6a12f85900..7167df250ef2 100644
--- a/core/hdd/inc/wlan_hdd_tdls.h
+++ b/core/hdd/inc/wlan_hdd_tdls.h
@@ -951,4 +951,22 @@ static inline void hdd_wlan_block_scan_by_tdls_event(void) {}
void process_rx_tdls_disc_resp_frame(hdd_adapter_t *adapter,
uint8_t *peer_addr, int8_t rx_rssi);
+#ifdef FEATURE_WLAN_TDLS
+/**
+ * hdd_tdls_init_completion() - Initialize completion var
+ * @adapter: Hdd adapter
+ *
+ * This function Initialize the completion variables for a
+ * particular adapter
+ *
+ * Return: none
+ */
+void hdd_tdls_init_completion(hdd_adapter_t *adapter);
+#else
+static inline void
+hdd_tdls_init_completion(hdd_adapter_t *adapter)
+{
+}
+#endif /* End of FEATURE_WLAN_TDLS */
+
#endif /* __HDD_TDLS_H */
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index b8d2ff72750a..863313648f8a 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -6652,13 +6652,6 @@ hdd_adapter_t *hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx,
pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy;
pHostapdAdapter->wdev.netdev = pWlanHostapdDev;
hdd_set_tso_flags(pHddCtx, pWlanHostapdDev);
- init_completion(&pHostapdAdapter->tx_action_cnf_event);
- init_completion(&pHostapdAdapter->cancel_rem_on_chan_var);
- init_completion(&pHostapdAdapter->rem_on_chan_ready_event);
- init_completion(&pHostapdAdapter->sta_authorized_event);
- init_completion(&pHostapdAdapter->offchannel_tx_event);
- init_completion(&pHostapdAdapter->scan_info.
- abortscan_event_var);
SET_NETDEV_DEV(pWlanHostapdDev, pHddCtx->parent_dev);
spin_lock_init(&pHostapdAdapter->pause_map_lock);
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index d2022d9553cf..6a40527d6577 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -3253,31 +3253,6 @@ static hdd_adapter_t *hdd_alloc_station_adapter(hdd_context_t *hdd_ctx,
goto err_qdf_init;
}
- init_completion(&adapter->disconnect_comp_var);
- init_completion(&adapter->roaming_comp_var);
- init_completion(&adapter->linkup_event_var);
- init_completion(&adapter->cancel_rem_on_chan_var);
- init_completion(&adapter->rem_on_chan_ready_event);
- init_completion(&adapter->sta_authorized_event);
- init_completion(&adapter->offchannel_tx_event);
- init_completion(&adapter->tx_action_cnf_event);
-#ifdef FEATURE_WLAN_TDLS
- init_completion(&adapter->tdls_add_station_comp);
- init_completion(&adapter->tdls_del_station_comp);
- init_completion(&adapter->tdls_mgmt_comp);
- init_completion(&adapter->tdls_link_establish_req_comp);
-#endif
- init_completion(&adapter->ibss_peer_info_comp);
- qdf_status = qdf_event_create(&adapter->change_country_code);
- if (QDF_IS_STATUS_ERROR(qdf_status)) {
- hdd_err("Change country code event init failed!");
- goto err_qdf_init;
- }
-
-
- init_completion(&adapter->scan_info.abortscan_event_var);
- init_completion(&adapter->lfr_fw_status.disable_lfr_event);
-
adapter->offloads_configured = false;
adapter->isLinkUpSvcNeeded = false;
adapter->higherDtimTransition = true;
@@ -4358,6 +4333,39 @@ static QDF_STATUS hdd_attach_adapter(hdd_context_t *hdd_ctx,
}
/**
+ * hdd_init_completion() - Initialize Completion Variables
+ * @adapter: HDD adapter
+ *
+ * This function Initialize the completion variables for
+ * a particular adapter
+ *
+ * Return: None
+ */
+
+static void hdd_init_completion(hdd_adapter_t *adapter)
+{
+ QDF_STATUS qdf_status;
+
+ init_completion(&adapter->disconnect_comp_var);
+ init_completion(&adapter->roaming_comp_var);
+ init_completion(&adapter->linkup_event_var);
+ init_completion(&adapter->cancel_rem_on_chan_var);
+ init_completion(&adapter->rem_on_chan_ready_event);
+ init_completion(&adapter->sta_authorized_event);
+ init_completion(&adapter->offchannel_tx_event);
+ init_completion(&adapter->tx_action_cnf_event);
+ init_completion(&adapter->ibss_peer_info_comp);
+ qdf_status = qdf_event_create(&adapter->change_country_code);
+ if (QDF_IS_STATUS_ERROR(qdf_status)) {
+ hdd_err("Change country code event init failed!");
+ }
+ init_completion(&adapter->scan_info.abortscan_event_var);
+ init_completion(&adapter->lfr_fw_status.disable_lfr_event);
+
+ hdd_tdls_init_completion(adapter);
+}
+
+/**
* hdd_open_adapter() - open and setup the hdd adatper
* @hdd_ctx: global hdd context
* @session_type: type of the interface to be created
@@ -4551,6 +4559,7 @@ hdd_adapter_t *hdd_open_adapter(hdd_context_t *hdd_ctx, uint8_t session_type,
return NULL;
}
+ hdd_init_completion(adapter);
INIT_WORK(&adapter->scan_block_work, wlan_hdd_cfg80211_scan_block_cb);
qdf_list_create(&adapter->blocked_scan_request_q,
CFG_MAX_SCAN_COUNT_MAX);
diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c
index 786b6723187f..a49ecdc68d15 100644
--- a/core/hdd/src/wlan_hdd_tdls.c
+++ b/core/hdd/src/wlan_hdd_tdls.c
@@ -6590,3 +6590,11 @@ revert_tdls_mode:
HDD_SET_TDLS_MODE_SOURCE_POLICY_MGR);
}
}
+
+void hdd_tdls_init_completion(hdd_adapter_t *adapter)
+{
+ init_completion(&adapter->tdls_add_station_comp);
+ init_completion(&adapter->tdls_del_station_comp);
+ init_completion(&adapter->tdls_mgmt_comp);
+ init_completion(&adapter->tdls_link_establish_req_comp);
+}