| From 9c5a18a31b321f120efda412281bb9f610f84aa0 Mon Sep 17 00:00:00 2001 |
| From: Johannes Berg <johannes.berg@intel.com> |
| Date: Tue, 9 Jun 2015 21:35:44 +0200 |
| Subject: cfg80211: wext: clear sinfo struct before calling driver |
| |
| From: Johannes Berg <johannes.berg@intel.com> |
| |
| commit 9c5a18a31b321f120efda412281bb9f610f84aa0 upstream. |
| |
| Until recently, mac80211 overwrote all the statistics it could |
| provide when getting called, but it now relies on the struct |
| having been zeroed by the caller. This was always the case in |
| nl80211, but wext used a static struct which could even cause |
| values from one device leak to another. |
| |
| Using a static struct is OK (as even documented in a comment) |
| since the whole usage of this function and its return value is |
| always locked under RTNL. Not clearing the struct for calling |
| the driver has always been wrong though, since drivers were |
| free to only fill values they could report, so calling this |
| for one device and then for another would always have leaked |
| values from one to the other. |
| |
| Fix this by initializing the structure in question before the |
| driver method call. |
| |
| This fixes https://bugzilla.kernel.org/show_bug.cgi?id=99691 |
| |
| Reported-by: Gerrit Renker <gerrit@erg.abdn.ac.uk> |
| Reported-by: Alexander Kaltsas <alexkaltsas@gmail.com> |
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| net/wireless/wext-compat.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/net/wireless/wext-compat.c |
| +++ b/net/wireless/wext-compat.c |
| @@ -1333,6 +1333,8 @@ static struct iw_statistics *cfg80211_wi |
| memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN); |
| wdev_unlock(wdev); |
| |
| + memset(&sinfo, 0, sizeof(sinfo)); |
| + |
| if (rdev_get_station(rdev, dev, bssid, &sinfo)) |
| return NULL; |
| |