]> git.hungrycats.org Git - linux/commitdiff
wifi: mac80211: check/clear fast rx for non-4addr sta VLAN changes
authorFelix Fietkau <nbd@nbd.name>
Sat, 16 Mar 2024 07:43:36 +0000 (08:43 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 3 Apr 2024 13:11:48 +0000 (15:11 +0200)
commit 4f2bdb3c5e3189297e156b3ff84b140423d64685 upstream.

When moving a station out of a VLAN and deleting the VLAN afterwards, the
fast_rx entry still holds a pointer to the VLAN's netdev, which can cause
use-after-free bugs. Fix this by immediately calling ieee80211_check_fast_rx
after the VLAN change.

Cc: stable@vger.kernel.org
Reported-by: ranygh@riseup.net
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://msgid.link/20240316074336.40442-1-nbd@nbd.name
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mac80211/cfg.c

index 594cd45b9d2dc9b0b70f99eb92e295da5e0f48b9..ebaf930bb4c903a49e82c2e6014131a53c5cb5a6 100644 (file)
@@ -2164,15 +2164,14 @@ static int ieee80211_change_station(struct wiphy *wiphy,
                }
 
                if (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
-                   sta->sdata->u.vlan.sta) {
-                       ieee80211_clear_fast_rx(sta);
+                   sta->sdata->u.vlan.sta)
                        RCU_INIT_POINTER(sta->sdata->u.vlan.sta, NULL);
-               }
 
                if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
                        ieee80211_vif_dec_num_mcast(sta->sdata);
 
                sta->sdata = vlansdata;
+               ieee80211_check_fast_rx(sta);
                ieee80211_check_fast_xmit(sta);
 
                if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {