Skip to content

Commit

Permalink
cfg80211: fix in nl80211_set_reg()
Browse files Browse the repository at this point in the history
There is a race on access to last_request and its alpha2
through reg_is_valid_request() and us possibly processing
first another regulatory request on another CPU. We avoid
this improbably race by locking with the cfg80211_mutex as
we should have done in the first place. While at it add
the assert on locking on reg_is_valid_request().

Cc: stable@kernel.org
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Luis R. Rodriguez authored and John W. Linville committed May 20, 2009
1 parent d0e18f8 commit 61405e9
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 1 deletion.
5 changes: 4 additions & 1 deletion net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -2570,6 +2570,8 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
return -EINVAL;
}

mutex_lock(&cfg80211_mutex);

if (!reg_is_valid_request(alpha2)) {
r = -EINVAL;
goto bad_reg;
Expand Down Expand Up @@ -2607,13 +2609,14 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)

BUG_ON(rule_idx != num_rules);

mutex_lock(&cfg80211_mutex);
r = set_regdom(rd);

mutex_unlock(&cfg80211_mutex);

return r;

bad_reg:
mutex_unlock(&cfg80211_mutex);
kfree(rd);
return r;
}
Expand Down
2 changes: 2 additions & 0 deletions net/wireless/reg.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,8 @@ static int call_crda(const char *alpha2)
/* Used by nl80211 before kmalloc'ing our regulatory domain */
bool reg_is_valid_request(const char *alpha2)
{
assert_cfg80211_lock();

if (!last_request)
return false;

Expand Down

0 comments on commit 61405e9

Please sign in to comment.