|
@@ -425,12 +425,16 @@ static int call_crda(const char *alpha2)
|
|
|
return kobject_uevent(®_pdev->dev.kobj, KOBJ_CHANGE);
|
|
|
}
|
|
|
|
|
|
-/* Used by nl80211 before kmalloc'ing our regulatory domain */
|
|
|
-bool reg_is_valid_request(const char *alpha2)
|
|
|
+static bool reg_is_valid_request(const char *alpha2)
|
|
|
{
|
|
|
+ assert_reg_lock();
|
|
|
+
|
|
|
if (!last_request)
|
|
|
return false;
|
|
|
|
|
|
+ if (last_request->processed)
|
|
|
+ return false;
|
|
|
+
|
|
|
return alpha2_equal(last_request->alpha2, alpha2);
|
|
|
}
|
|
|
|
|
@@ -1470,6 +1474,7 @@ new_request:
|
|
|
|
|
|
last_request = pending_request;
|
|
|
last_request->intersect = intersect;
|
|
|
+ last_request->processed = false;
|
|
|
|
|
|
pending_request = NULL;
|
|
|
|
|
@@ -2060,11 +2065,13 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
|
|
const struct ieee80211_regdomain *regd;
|
|
|
const struct ieee80211_regdomain *intersected_rd = NULL;
|
|
|
struct wiphy *request_wiphy;
|
|
|
+
|
|
|
/* Some basic sanity checks first */
|
|
|
|
|
|
+ if (!reg_is_valid_request(rd->alpha2))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
if (is_world_regdom(rd->alpha2)) {
|
|
|
- if (WARN_ON(!reg_is_valid_request(rd->alpha2)))
|
|
|
- return -EINVAL;
|
|
|
update_world_regdomain(rd);
|
|
|
return 0;
|
|
|
}
|
|
@@ -2073,9 +2080,6 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
|
|
!is_unknown_alpha2(rd->alpha2))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (!last_request)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
/*
|
|
|
* Lets only bother proceeding on the same alpha2 if the current
|
|
|
* rd is non static (it means CRDA was present and was used last)
|
|
@@ -2097,9 +2101,6 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
|
|
|
* internal EEPROM data
|
|
|
*/
|
|
|
|
|
|
- if (WARN_ON(!reg_is_valid_request(rd->alpha2)))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
if (!is_valid_rd(rd)) {
|
|
|
pr_err("Invalid regulatory domain detected:\n");
|
|
|
print_regdomain_info(rd);
|