Skip to content

Commit

Permalink
cfg80211: fix BSS double-unlinking
Browse files Browse the repository at this point in the history
When multiple interfaces are actively trying
to associate with the same BSS, they may both
find that the BSS isn't there and then try to
unlink it. This can cause errors since the
unlinking code can't currently deal with items
that have already been unlinked.

Normally this doesn't happen as most people
don't try to use multiple station interfaces
that associate at the same time too.

Fix this by using the list entry as a flag to
see if the item is still on a list.

Cc: stable@kernel.org
Reported-by: Ben Greear <greearb@candelatech.com>
Tested-by: Hun-Kyi Wynn <hkwynn@candelatech.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Oct 6, 2010
1 parent b206b4e commit 3207390
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions net/wireless/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -650,14 +650,14 @@ void cfg80211_unlink_bss(struct wiphy *wiphy, struct cfg80211_bss *pub)
bss = container_of(pub, struct cfg80211_internal_bss, pub);

spin_lock_bh(&dev->bss_lock);
if (!list_empty(&bss->list)) {
list_del_init(&bss->list);
dev->bss_generation++;
rb_erase(&bss->rbn, &dev->bss_tree);

list_del(&bss->list);
dev->bss_generation++;
rb_erase(&bss->rbn, &dev->bss_tree);

kref_put(&bss->ref, bss_release);
}
spin_unlock_bh(&dev->bss_lock);

kref_put(&bss->ref, bss_release);
}
EXPORT_SYMBOL(cfg80211_unlink_bss);

Expand Down

0 comments on commit 3207390

Please sign in to comment.