]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: iwlwifi: fix potential use after free in iwl_mld_remove_link()
authorDan Carpenter <dan.carpenter@linaro.org>
Tue, 23 Sep 2025 11:20:16 +0000 (14:20 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Sun, 19 Oct 2025 12:12:36 +0000 (15:12 +0300)
This code frees "link" by calling kfree_rcu(link, rcu_head) and then it
dereferences "link" to get the "link->fw_id".  Save the "link->fw_id"
first to avoid a potential use after free.

Fixes: d1e879ec600f ("wifi: iwlwifi: add iwlmld sub-driver")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Link: https://patch.msgid.link/aNKCcKlbSkkS4_gO@stanley.mountain
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
drivers/net/wireless/intel/iwlwifi/mld/link.c

index 782fc41aa1c31446385d1938e24f3293fb0c368d..960dcd208f005c791d136d8402a9ae0e212d8573 100644 (file)
@@ -501,6 +501,7 @@ void iwl_mld_remove_link(struct iwl_mld *mld,
        struct iwl_mld_vif *mld_vif = iwl_mld_vif_from_mac80211(bss_conf->vif);
        struct iwl_mld_link *link = iwl_mld_link_from_mac80211(bss_conf);
        bool is_deflink = link == &mld_vif->deflink;
+       u8 fw_id = link->fw_id;
 
        if (WARN_ON(!link || link->active))
                return;
@@ -513,10 +514,10 @@ void iwl_mld_remove_link(struct iwl_mld *mld,
 
        RCU_INIT_POINTER(mld_vif->link[bss_conf->link_id], NULL);
 
-       if (WARN_ON(link->fw_id >= mld->fw->ucode_capa.num_links))
+       if (WARN_ON(fw_id >= mld->fw->ucode_capa.num_links))
                return;
 
-       RCU_INIT_POINTER(mld->fw_id_to_bss_conf[link->fw_id], NULL);
+       RCU_INIT_POINTER(mld->fw_id_to_bss_conf[fw_id], NULL);
 }
 
 void iwl_mld_handle_missed_beacon_notif(struct iwl_mld *mld,