Skip to content

Commit

Permalink
cfg80211: fix potential BSS memory leak and update
Browse files Browse the repository at this point in the history
In the odd case that while updating information from a beacon,
a BSS was found that is part of a hidden group, we drop the
new information. In this case, however, we leak the IE buffer
from the update, and erroneously update the entry's timestamp
so it will never time out. Fix both these issues.

Cc: Larry Finger <[email protected]>
Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
jmberg authored and jmberg-intel committed Mar 7, 2013
1 parent 021fcdc commit 1345ee6
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions net/wireless/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -698,11 +698,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
found = rb_find_bss(dev, tmp, BSS_CMP_REGULAR);

if (found) {
found->pub.beacon_interval = tmp->pub.beacon_interval;
found->pub.signal = tmp->pub.signal;
found->pub.capability = tmp->pub.capability;
found->ts = tmp->ts;

/* Update IEs */
if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
const struct cfg80211_bss_ies *old;
Expand All @@ -723,6 +718,8 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,

if (found->pub.hidden_beacon_bss &&
!list_empty(&found->hidden_list)) {
const struct cfg80211_bss_ies *f;

/*
* The found BSS struct is one of the probe
* response members of a group, but we're
Expand All @@ -732,6 +729,10 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
* SSID to showing it, which is confusing so
* drop this information.
*/

f = rcu_access_pointer(tmp->pub.beacon_ies);
kfree_rcu((struct cfg80211_bss_ies *)f,
rcu_head);
goto drop;
}

Expand Down Expand Up @@ -761,6 +762,11 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
kfree_rcu((struct cfg80211_bss_ies *)old,
rcu_head);
}

found->pub.beacon_interval = tmp->pub.beacon_interval;
found->pub.signal = tmp->pub.signal;
found->pub.capability = tmp->pub.capability;
found->ts = tmp->ts;
} else {
struct cfg80211_internal_bss *new;
struct cfg80211_internal_bss *hidden;
Expand Down

0 comments on commit 1345ee6

Please sign in to comment.