aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2017-10-26 05:24:27 -0400
committerJohannes Berg <johannes.berg@intel.com>2017-11-20 10:55:29 -0500
commitd7be102f2945a626f55e0501e52bb31ba3e77b81 (patch)
tree22f632b38065929c1bb2e8c23c94202b2c5d95f9
parent7cca2acdff2d7c53b4a553756e731693152115d4 (diff)
cfg80211: initialize regulatory keys/database later
When cfg80211 is built as a module, everything is fine, and we can keep the code as is; in fact, we have to, because there can only be a single module_init(). When cfg80211 is built-in, however, it needs to initialize before drivers (device_initcall/module_init), and thus used to be at subsys_initcall(). I'd moved it to fs_initcall() earlier, where it can remain. However, this is still too early because at that point the key infrastructure hasn't been initialized yet, so X.509 certificates can't be parsed yet. To work around this problem, load the regdb keys only later in a late_initcall(), at which point the necessary infrastructure has been initialized. Fixes: 90a53e4432b1 ("cfg80211: implement regdb signature checking") Reported-by: Xiaolong Ye <xiaolong.ye@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--net/wireless/reg.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 3871998059de..78e71b0390be 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -3644,27 +3644,14 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy,
3644 } 3644 }
3645} 3645}
3646 3646
3647int __init regulatory_init(void) 3647static int __init regulatory_init_db(void)
3648{ 3648{
3649 int err = 0; 3649 int err;
3650 3650
3651 err = load_builtin_regdb_keys(); 3651 err = load_builtin_regdb_keys();
3652 if (err) 3652 if (err)
3653 return err; 3653 return err;
3654 3654
3655 reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
3656 if (IS_ERR(reg_pdev))
3657 return PTR_ERR(reg_pdev);
3658
3659 spin_lock_init(&reg_requests_lock);
3660 spin_lock_init(&reg_pending_beacons_lock);
3661 spin_lock_init(&reg_indoor_lock);
3662
3663 rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
3664
3665 user_alpha2[0] = '9';
3666 user_alpha2[1] = '7';
3667
3668 /* We always try to get an update for the static regdomain */ 3655 /* We always try to get an update for the static regdomain */
3669 err = regulatory_hint_core(cfg80211_world_regdom->alpha2); 3656 err = regulatory_hint_core(cfg80211_world_regdom->alpha2);
3670 if (err) { 3657 if (err) {
@@ -3692,6 +3679,31 @@ int __init regulatory_init(void)
3692 3679
3693 return 0; 3680 return 0;
3694} 3681}
3682#ifndef MODULE
3683late_initcall(regulatory_init_db);
3684#endif
3685
3686int __init regulatory_init(void)
3687{
3688 reg_pdev = platform_device_register_simple("regulatory", 0, NULL, 0);
3689 if (IS_ERR(reg_pdev))
3690 return PTR_ERR(reg_pdev);
3691
3692 spin_lock_init(&reg_requests_lock);
3693 spin_lock_init(&reg_pending_beacons_lock);
3694 spin_lock_init(&reg_indoor_lock);
3695
3696 rcu_assign_pointer(cfg80211_regdomain, cfg80211_world_regdom);
3697
3698 user_alpha2[0] = '9';
3699 user_alpha2[1] = '7';
3700
3701#ifdef MODULE
3702 return regulatory_init_db();
3703#else
3704 return 0;
3705#endif
3706}
3695 3707
3696void regulatory_exit(void) 3708void regulatory_exit(void)
3697{ 3709{