ソースを参照

qcacmn: Validate SSID first while fetching peer pmksa

Validate the SSID & cache ID if SSID length is present in the
pmksa entry, as in FILS case only SSID and cache id are filled
and BSSID is not filled.

So validate the BSSID only if the SSID is not present.

Change-Id: Ia0a31f953869f00495fad597bb564ec706425312
CRs-Fixed: 3051530
Pragaspathi Thilagaraj 3 年 前
コミット
ce387c8fd3
1 ファイル変更25 行追加13 行削除
  1. 25 13
      umac/cmn_services/crypto/src/wlan_crypto_global_api.c

+ 25 - 13
umac/cmn_services/crypto/src/wlan_crypto_global_api.c

@@ -371,7 +371,8 @@ QDF_STATUS wlan_crypto_set_pmksa(struct wlan_crypto_params *crypto_params,
 		return QDF_STATUS_E_INVAL;
 	}
 	crypto_params->pmksa[first_available_slot] = pmksa;
-	crypto_debug("PMKSA: Added the PMKSA entry at index=%d", i);
+	crypto_debug("PMKSA: Added the PMKSA entry at index=%d",
+		     first_available_slot);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -380,7 +381,7 @@ static
 QDF_STATUS wlan_crypto_del_pmksa(struct wlan_crypto_params *crypto_params,
 				 struct wlan_crypto_pmksa *pmksa)
 {
-	uint8_t i, j;
+	uint8_t i, j, valid_entries_in_table = 0;
 	bool match_found = false;
 	u8 del_pmk[MAX_PMK_LEN] = {0};
 
@@ -388,7 +389,12 @@ QDF_STATUS wlan_crypto_del_pmksa(struct wlan_crypto_params *crypto_params,
 	for (i = 0; i < WLAN_CRYPTO_MAX_PMKID; i++) {
 		if (!crypto_params->pmksa[i])
 			continue;
-		if (qdf_is_macaddr_equal(&pmksa->bssid,
+
+		valid_entries_in_table++;
+
+		if (!pmksa->ssid_len &&
+		    !qdf_is_macaddr_zero(&pmksa->bssid) &&
+		    qdf_is_macaddr_equal(&pmksa->bssid,
 					 &crypto_params->pmksa[i]->bssid)) {
 			match_found = true;
 		} else if (pmksa->ssid_len &&
@@ -436,7 +442,8 @@ QDF_STATUS wlan_crypto_del_pmksa(struct wlan_crypto_params *crypto_params,
 	}
 
 	if (i == WLAN_CRYPTO_MAX_PMKID && !match_found)
-		crypto_debug("No such pmksa entry exists");
+		crypto_debug("No such pmksa entry exists: valid entries:%d",
+			     valid_entries_in_table);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -454,6 +461,8 @@ QDF_STATUS wlan_crypto_pmksa_flush(struct wlan_crypto_params *crypto_params)
 		crypto_params->pmksa[i] = NULL;
 	}
 
+	crypto_debug("Flushed the pmksa table");
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -608,16 +617,19 @@ wlan_crypto_get_peer_pmksa(struct wlan_objmgr_vdev *vdev,
 	for (i = 0; i < WLAN_CRYPTO_MAX_PMKID; i++) {
 		if (!crypto_params->pmksa[i])
 			continue;
-		if (qdf_is_macaddr_equal(&pmksa->bssid,
-					 &crypto_params->pmksa[i]->bssid)) {
+
+		if (pmksa->ssid_len &&
+		    !qdf_mem_cmp(pmksa->ssid,
+				 crypto_params->pmksa[i]->ssid,
+				 pmksa->ssid_len) &&
+		    !qdf_mem_cmp(pmksa->cache_id,
+				 crypto_params->pmksa[i]->cache_id,
+				 WLAN_CACHE_ID_LEN)) {
 			return crypto_params->pmksa[i];
-		} else if (pmksa->ssid_len &&
-			   !qdf_mem_cmp(pmksa->ssid,
-					crypto_params->pmksa[i]->ssid,
-					pmksa->ssid_len) &&
-			   !qdf_mem_cmp(pmksa->cache_id,
-					crypto_params->pmksa[i]->cache_id,
-					WLAN_CACHE_ID_LEN)){
+		} else if (!pmksa->ssid_len &&
+			   !qdf_is_macaddr_zero(&pmksa->bssid) &&
+			   qdf_is_macaddr_equal(&pmksa->bssid,
+					 &crypto_params->pmksa[i]->bssid)) {
 			return crypto_params->pmksa[i];
 		}
 	}