From 8a44b64ba4e24892900cca09d5137ac1a9148722 Mon Sep 17 00:00:00 2001 From: tinlin Date: Wed, 25 Apr 2018 13:56:06 +0800 Subject: [PATCH] qcacld-3.0: Fix overwrite in wlan_hdd_cfg80211_set_ie Fix overwrite when handling RSN element and WAPI AKM suite list in wlan_hdd_cfg80211_set_ie. Change-Id: I63528da4c2dfafa22f2c6fc73afe52727af02b64 CRs-Fixed: 2228031 --- core/hdd/src/wlan_hdd_cfg80211.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 21edf92cb0fd..3b80f52e01d1 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -18746,9 +18746,9 @@ static int wlan_hdd_cfg80211_set_ie(struct hdd_adapter *adapter, uint16_t remLen = ie_len; #ifdef FEATURE_WLAN_WAPI uint32_t akmsuite[MAX_NUM_AKM_SUITES]; - u16 *tmp; + uint8_t *tmp; uint16_t akmsuiteCount; - int *akmlist; + uint32_t *akmlist; #endif int status; uint8_t *security_ie; @@ -18946,16 +18946,16 @@ static int wlan_hdd_cfg80211_set_ie(struct hdd_adapter *adapter, } break; case DOT11F_EID_RSN: - hdd_debug("Set RSN IE(len %d)", eLen + 2); - if (eLen > (MAX_WPA_RSN_IE_LEN - 2)) { + if (eLen > DOT11F_IE_RSN_MAX_LEN) { hdd_err("%s: Invalid WPA RSN IE length[%d]", - __func__, eLen); + __func__, eLen); return -EINVAL; } memset(security_ie, 0, MAX_WPA_RSN_IE_LEN); memcpy(security_ie, genie - 2, (eLen + 2)); roam_profile->pRSNReqIE = security_ie; roam_profile->nRSNReqIELength = eLen + 2; /* ie_len; */ + hdd_debug("Set RSN IE(len %d)", eLen + 2); break; /* * Appending Extended Capabilities with Interworking bit set @@ -18990,15 +18990,18 @@ static int wlan_hdd_cfg80211_set_ie(struct hdd_adapter *adapter, #ifdef FEATURE_WLAN_WAPI case WLAN_EID_WAPI: /* Setting WAPI Mode to ON=1 */ - adapter->wapi_info.wapi_mode = true; + adapter->wapi_info.wapi_mode = 1; hdd_debug("WAPI MODE IS %u", adapter->wapi_info.wapi_mode); - tmp = (u16 *) ie; - tmp = tmp + 2; /* Skip element Id and Len, Version */ + tmp = (uint8_t *)ie; + tmp = tmp + 4; /* Skip element Id and Len, Version */ + /* Get the number of AKM suite */ akmsuiteCount = WPA_GET_LE16(tmp); - tmp = tmp + 1; - akmlist = (int *)(tmp); + /* Skip the number of AKM suite */ + tmp = tmp + 2; + /* AKM suite list, each OUI contains 4 bytes */ + akmlist = (uint32_t *)(tmp); if (akmsuiteCount <= MAX_NUM_AKM_SUITES) { - memcpy(akmsuite, akmlist, (4 * akmsuiteCount)); + memcpy(akmsuite, akmlist, akmsuiteCount); } else { hdd_err("Invalid akmSuite count: %u", akmsuiteCount);