wifi: mac80211: pass 'sta' to ieee80211_rx_data_set_sta()
authorJohannes Berg <johannes.berg@intel.com>
Wed, 15 Feb 2023 09:07:05 +0000 (10:07 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 15 Feb 2023 17:27:25 +0000 (18:27 +0100)
There's at least one case in ieee80211_rx_for_interface()
where we might pass &((struct sta_info *)NULL)->sta to it
only to then do container_of(), and then checking the
result for NULL, but checking the result of container_of()
for NULL looks really odd.

Fix this by just passing the struct sta_info * instead.

Fixes: e66b7920aa5a ("wifi: mac80211: fix initialization of rx->link and rx->link_sta")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/rx.c

index 7bcd77384191238aecb68b7d8b74c601f69dc1da..69aa623163c6d75109ed66ff169d5df71f854ccc 100644 (file)
@@ -4115,13 +4115,8 @@ static bool ieee80211_rx_data_set_link(struct ieee80211_rx_data *rx,
 }
 
 static bool ieee80211_rx_data_set_sta(struct ieee80211_rx_data *rx,
-                                     struct ieee80211_sta *pubsta,
-                                     int link_id)
+                                     struct sta_info *sta, int link_id)
 {
-       struct sta_info *sta;
-
-       sta = container_of(pubsta, struct sta_info, sta);
-
        rx->link_id = link_id;
        rx->sta = sta;
 
@@ -4159,7 +4154,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
        if (sta->sta.valid_links)
                link_id = ffs(sta->sta.valid_links) - 1;
 
-       if (!ieee80211_rx_data_set_sta(&rx, &sta->sta, link_id))
+       if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
                return;
 
        tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
@@ -4205,7 +4200,7 @@ void ieee80211_mark_rx_ba_filtered_frames(struct ieee80211_sta *pubsta, u8 tid,
 
        sta = container_of(pubsta, struct sta_info, sta);
 
-       if (!ieee80211_rx_data_set_sta(&rx, pubsta, -1))
+       if (!ieee80211_rx_data_set_sta(&rx, sta, -1))
                return;
 
        rcu_read_lock();
@@ -4914,6 +4909,7 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
        struct ieee80211_fast_rx *fast_rx;
        struct ieee80211_rx_data rx;
+       struct sta_info *sta;
        int link_id = -1;
 
        memset(&rx, 0, sizeof(rx));
@@ -4941,7 +4937,8 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
         * link_id is used only for stats purpose and updating the stats on
         * the deflink is fine?
         */
-       if (!ieee80211_rx_data_set_sta(&rx, pubsta, link_id))
+       sta = container_of(pubsta, struct sta_info, sta);
+       if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
                goto drop;
 
        fast_rx = rcu_dereference(rx.sta->fast_rx);
@@ -4981,7 +4978,7 @@ static bool ieee80211_rx_for_interface(struct ieee80211_rx_data *rx,
                        link_id = status->link_id;
        }
 
-       if (!ieee80211_rx_data_set_sta(rx, &sta->sta, link_id))
+       if (!ieee80211_rx_data_set_sta(rx, sta, link_id))
                return false;
 
        return ieee80211_prepare_and_rx_handle(rx, skb, consume);
@@ -5048,7 +5045,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
                        link_id = status->link_id;
 
                if (pubsta) {
-                       if (!ieee80211_rx_data_set_sta(&rx, pubsta, link_id))
+                       sta = container_of(pubsta, struct sta_info, sta);
+                       if (!ieee80211_rx_data_set_sta(&rx, sta, link_id))
                                goto out;
 
                        /*
@@ -5085,8 +5083,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
                        }
 
                        rx.sdata = prev_sta->sdata;
-                       if (!ieee80211_rx_data_set_sta(&rx, &prev_sta->sta,
-                                                      link_id))
+                       if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
                                goto out;
 
                        if (!status->link_valid && prev_sta->sta.mlo)
@@ -5099,8 +5096,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
 
                if (prev_sta) {
                        rx.sdata = prev_sta->sdata;
-                       if (!ieee80211_rx_data_set_sta(&rx, &prev_sta->sta,
-                                                      link_id))
+                       if (!ieee80211_rx_data_set_sta(&rx, prev_sta, link_id))
                                goto out;
 
                        if (!status->link_valid && prev_sta->sta.mlo)