aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/module.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-11 19:09:14 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-11 19:09:14 -0400
commit4251c2a67011801caecd63671f26dd8c9aedb24c (patch)
tree06f659cb3f9e91fb2b8fc92791b5e021754e025e /kernel/module.c
parentc31c24b8251fd44962a9b0bf82c770653bf07f6e (diff)
parent4982223e51e8ea9d09bb33c8323b5ec1877b2b51 (diff)
Merge tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
Pull module updates from Rusty Russell: "Most of this is cleaning up various driver sysfs permissions so we can re-add the perm check (we unified the module param and sysfs checks, but the module ones were stronger so we weakened them temporarily). Param parsing gets documented, and also "--" now forces args to be handed to init (and ignored by the kernel). Module NX/RO protections get tightened: we now set them before calling parse_args()" * tag 'modules-next-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux: module: set nx before marking module MODULE_STATE_COMING. samples/kobject/: avoid world-writable sysfs files. drivers/hid/hid-picolcd_fb: avoid world-writable sysfs files. drivers/staging/speakup/: avoid world-writable sysfs files. drivers/regulator/virtual: avoid world-writable sysfs files. drivers/scsi/pm8001/pm8001_ctl.c: avoid world-writable sysfs files. drivers/hid/hid-lg4ff.c: avoid world-writable sysfs files. drivers/video/fbdev/sm501fb.c: avoid world-writable sysfs files. drivers/mtd/devices/docg3.c: avoid world-writable sysfs files. speakup: fix incorrect perms on speakup_acntsa.c cpumask.h: silence warning with -Wsign-compare Documentation: Update kernel-parameters.tx param: hand arguments after -- straight to init modpost: Fix resource leak in read_dump()
Diffstat (limited to 'kernel/module.c')
-rw-r--r--kernel/module.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/kernel/module.c b/kernel/module.c
index 079c4615607d..81e727cf6df9 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3020,21 +3020,6 @@ static int do_init_module(struct module *mod)
3020 */ 3020 */
3021 current->flags &= ~PF_USED_ASYNC; 3021 current->flags &= ~PF_USED_ASYNC;
3022 3022
3023 blocking_notifier_call_chain(&module_notify_list,
3024 MODULE_STATE_COMING, mod);
3025
3026 /* Set RO and NX regions for core */
3027 set_section_ro_nx(mod->module_core,
3028 mod->core_text_size,
3029 mod->core_ro_size,
3030 mod->core_size);
3031
3032 /* Set RO and NX regions for init */
3033 set_section_ro_nx(mod->module_init,
3034 mod->init_text_size,
3035 mod->init_ro_size,
3036 mod->init_size);
3037
3038 do_mod_ctors(mod); 3023 do_mod_ctors(mod);
3039 /* Start the module */ 3024 /* Start the module */
3040 if (mod->init != NULL) 3025 if (mod->init != NULL)
@@ -3165,9 +3150,26 @@ static int complete_formation(struct module *mod, struct load_info *info)
3165 /* This relies on module_mutex for list integrity. */ 3150 /* This relies on module_mutex for list integrity. */
3166 module_bug_finalize(info->hdr, info->sechdrs, mod); 3151 module_bug_finalize(info->hdr, info->sechdrs, mod);
3167 3152
3153 /* Set RO and NX regions for core */
3154 set_section_ro_nx(mod->module_core,
3155 mod->core_text_size,
3156 mod->core_ro_size,
3157 mod->core_size);
3158
3159 /* Set RO and NX regions for init */
3160 set_section_ro_nx(mod->module_init,
3161 mod->init_text_size,
3162 mod->init_ro_size,
3163 mod->init_size);
3164
3168 /* Mark state as coming so strong_try_module_get() ignores us, 3165 /* Mark state as coming so strong_try_module_get() ignores us,
3169 * but kallsyms etc. can see us. */ 3166 * but kallsyms etc. can see us. */
3170 mod->state = MODULE_STATE_COMING; 3167 mod->state = MODULE_STATE_COMING;
3168 mutex_unlock(&module_mutex);
3169
3170 blocking_notifier_call_chain(&module_notify_list,
3171 MODULE_STATE_COMING, mod);
3172 return 0;
3171 3173
3172out: 3174out:
3173 mutex_unlock(&module_mutex); 3175 mutex_unlock(&module_mutex);
@@ -3190,6 +3192,7 @@ static int load_module(struct load_info *info, const char __user *uargs,
3190{ 3192{
3191 struct module *mod; 3193 struct module *mod;
3192 long err; 3194 long err;
3195 char *after_dashes;
3193 3196
3194 err = module_sig_check(info); 3197 err = module_sig_check(info);
3195 if (err) 3198 if (err)
@@ -3277,10 +3280,15 @@ static int load_module(struct load_info *info, const char __user *uargs,
3277 goto ddebug_cleanup; 3280 goto ddebug_cleanup;
3278 3281
3279 /* Module is ready to execute: parsing args may do that. */ 3282 /* Module is ready to execute: parsing args may do that. */
3280 err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, 3283 after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
3281 -32768, 32767, unknown_module_param_cb); 3284 -32768, 32767, unknown_module_param_cb);
3282 if (err < 0) 3285 if (IS_ERR(after_dashes)) {
3286 err = PTR_ERR(after_dashes);
3283 goto bug_cleanup; 3287 goto bug_cleanup;
3288 } else if (after_dashes) {
3289 pr_warn("%s: parameters '%s' after `--' ignored\n",
3290 mod->name, after_dashes);
3291 }
3284 3292
3285 /* Link in to syfs. */ 3293 /* Link in to syfs. */
3286 err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp); 3294 err = mod_sysfs_setup(mod, info, mod->kp, mod->num_kp);