diff options
| author | Abhinav Kumar <abhikuma@codeaurora.org> | 2018-10-01 15:45:53 +0530 |
|---|---|---|
| committer | Abhinav Kumar <abhikuma@codeaurora.org> | 2018-10-01 15:46:42 +0530 |
| commit | 2e869b1cdcb34ba64ea8cfcd39eafa945a8070b0 (patch) | |
| tree | a3fe2316ea9344418e17556abaae363bcb2f54d8 | |
| parent | ec11f86855c3da4cdcba10dbeeea06e19305dac7 (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.h | 18 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_hostapd.c | 7 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 59 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_tdls.c | 8 |
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); +} |
