Skip to content

Commit

Permalink
cfg80211: fix cmp_ies
Browse files Browse the repository at this point in the history
When comparing two items by IE, the sort order
wasn't stable, which could lead to issues in the
rbtree. Make it stable by making a missing IE
sort before a present IE.

Also sort by length first if it differs and then
by contents.

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 Nov 7, 2011
1 parent 133a3ff commit 3b6ef63
Showing 1 changed file with 8 additions and 5 deletions.
13 changes: 8 additions & 5 deletions net/wireless/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,17 +259,20 @@ static int cmp_ies(u8 num, u8 *ies1, size_t len1, u8 *ies2, size_t len2)
{
const u8 *ie1 = cfg80211_find_ie(num, ies1, len1);
const u8 *ie2 = cfg80211_find_ie(num, ies2, len2);
int r;

/* equal if both missing */
if (!ie1 && !ie2)
return 0;
if (!ie1 || !ie2)
/* sort missing IE before (left of) present IE */
if (!ie1)
return -1;
if (!ie2)
return 1;

r = memcmp(ie1 + 2, ie2 + 2, min(ie1[1], ie2[1]));
if (r == 0 && ie1[1] != ie2[1])
/* sort by length first, then by contents */
if (ie1[1] != ie2[1])
return ie2[1] - ie1[1];
return r;
return memcmp(ie1 + 2, ie2 + 2, ie1[1]);
}

static bool is_bss(struct cfg80211_bss *a,
Expand Down

0 comments on commit 3b6ef63

Please sign in to comment.