summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Neumann <s.neumann@raumfeld.com>2010-12-09 15:05:24 +0100
committerJohn W. Linville <linville@tuxdriver.com>2010-12-13 15:23:28 -0500
commit01123e233193a544c85b622e1690f44532052c5b (patch)
tree3632678a9441a2dce021f6a2ceada5de4e7e7e07
parent998d516d9546eba04dd99ae49a78acb0cf770478 (diff)
downloadlinux-3.10-01123e233193a544c85b622e1690f44532052c5b.tar.gz
linux-3.10-01123e233193a544c85b622e1690f44532052c5b.tar.bz2
linux-3.10-01123e233193a544c85b622e1690f44532052c5b.zip
cfg80211: update information elements in cached BSS struct
When a cached BSS struct is updated because a new beacon was received, the code replaces the cached information elements by the IEs from the new beacon. However it did not update the pub.information_elements and pub.len_information_elements fields leaving them either pointing to the old beacon IEs or in an inconsistent state where the data is replaced by the new beacon IEs but len_information_elements still has its value from the first beacon. Fix this by updating the information elements fields if they are pointing to beacon IEs. Signed-off-by: Sven Neumann <s.neumann@raumfeld.com> Reviewed-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/wireless/scan.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 503ebb86ba1..ea427f418f6 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -464,6 +464,9 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
if (res->pub.beacon_ies) {
size_t used = dev->wiphy.bss_priv_size + sizeof(*res);
size_t ielen = res->pub.len_beacon_ies;
+ bool information_elements_is_beacon_ies =
+ (found->pub.information_elements ==
+ found->pub.beacon_ies);
if (found->pub.beacon_ies &&
!found->beacon_ies_allocated &&
@@ -487,6 +490,14 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
found->pub.len_beacon_ies = ielen;
}
}
+
+ /* Override IEs if they were from a beacon before */
+ if (information_elements_is_beacon_ies) {
+ found->pub.information_elements =
+ found->pub.beacon_ies;
+ found->pub.len_information_elements =
+ found->pub.len_beacon_ies;
+ }
}
kref_put(&res->ref, bss_release);