wifi: brcmfmac: cfg80211: Handle SSID based pmksa deletion
authorJanne Grunau <j@jannau.net>
Sat, 3 Aug 2024 19:52:55 +0000 (21:52 +0200)
committerKalle Valo <kvalo@kernel.org>
Sat, 10 Aug 2024 09:07:27 +0000 (12:07 +0300)
wpa_supplicant 2.11 sends since 1efdba5fdc2c ("Handle PMKSA flush in the
driver for SAE/OWE offload cases") SSID based PMKSA del commands.
brcmfmac is not prepared and tries to dereference the NULL bssid and
pmkid pointers in cfg80211_pmksa. PMKID_V3 operations support SSID based
updates so copy the SSID.

Fixes: a96202acaea4 ("wifi: brcmfmac: cfg80211: Add support for PMKID_V3 operations")
Cc: stable@vger.kernel.org # 6.4.x
Signed-off-by: Janne Grunau <j@jannau.net>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20240803-brcmfmac_pmksa_del_ssid-v1-1-4e85f19135e1@jannau.net
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index 1585a5653ee4b9435fb4490281ecfe0b57395aaa..d4cc5fa92341d5be73fa41a9c5bbbdf60bcdf837 100644 (file)
@@ -4320,9 +4320,16 @@ brcmf_pmksa_v3_op(struct brcmf_if *ifp, struct cfg80211_pmksa *pmksa,
                /* Single PMK operation */
                pmk_op->count = cpu_to_le16(1);
                length += sizeof(struct brcmf_pmksa_v3);
-               memcpy(pmk_op->pmk[0].bssid, pmksa->bssid, ETH_ALEN);
-               memcpy(pmk_op->pmk[0].pmkid, pmksa->pmkid, WLAN_PMKID_LEN);
-               pmk_op->pmk[0].pmkid_len = WLAN_PMKID_LEN;
+               if (pmksa->bssid)
+                       memcpy(pmk_op->pmk[0].bssid, pmksa->bssid, ETH_ALEN);
+               if (pmksa->pmkid) {
+                       memcpy(pmk_op->pmk[0].pmkid, pmksa->pmkid, WLAN_PMKID_LEN);
+                       pmk_op->pmk[0].pmkid_len = WLAN_PMKID_LEN;
+               }
+               if (pmksa->ssid && pmksa->ssid_len) {
+                       memcpy(pmk_op->pmk[0].ssid.SSID, pmksa->ssid, pmksa->ssid_len);
+                       pmk_op->pmk[0].ssid.SSID_len = pmksa->ssid_len;
+               }
                pmk_op->pmk[0].time_left = cpu_to_le32(alive ? BRCMF_PMKSA_NO_EXPIRY : 0);
        }