mac80211: call get_expected_throughput only after adding station
authorMaxim Altshul <maxim.altshul@ti.com>
Thu, 11 Aug 2016 10:38:16 +0000 (13:38 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 11 Aug 2016 18:00:37 +0000 (20:00 +0200)
Depending on which method the driver implements, userspace could
call this (indirectly, by getting station info) before the driver
knows about the station, possibly causing it to misbehave.

Therefore, add a check for sta->uploaded which indicates that the
driver knows about the station.

Signed-off-by: Maxim Altshul <maxim.altshul@ti.com>
[reword commit message]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/driver-ops.h
net/mac80211/sta_info.c

index ba5fc1f01e5353da7c0d8bf3a28156abb83a92ca..42a41ae405ba0fed1ea3e552cd6c5aba5b8d9fd2 100644 (file)
@@ -1088,13 +1088,13 @@ static inline void drv_leave_ibss(struct ieee80211_local *local,
 }
 
 static inline u32 drv_get_expected_throughput(struct ieee80211_local *local,
-                                             struct ieee80211_sta *sta)
+                                             struct sta_info *sta)
 {
        u32 ret = 0;
 
-       trace_drv_get_expected_throughput(sta);
-       if (local->ops->get_expected_throughput)
-               ret = local->ops->get_expected_throughput(&local->hw, sta);
+       trace_drv_get_expected_throughput(&sta->sta);
+       if (local->ops->get_expected_throughput && sta->uploaded)
+               ret = local->ops->get_expected_throughput(&local->hw, &sta->sta);
        trace_drv_return_u32(local, ret);
 
        return ret;
index d1cba819e19a365c18befce14ff3d071121ab259..19f14c907d7424798ca6203b404fd8b55b9ce9d8 100644 (file)
@@ -2301,7 +2301,7 @@ u32 sta_get_expected_throughput(struct sta_info *sta)
        if (ref && ref->ops->get_expected_throughput)
                thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv);
        else
-               thr = drv_get_expected_throughput(local, &sta->sta);
+               thr = drv_get_expected_throughput(local, sta);
 
        return thr;
 }