|
@@ -1491,6 +1491,9 @@ static void free_module(struct module *mod)
|
|
|
/* Module unload stuff */
|
|
|
module_unload_free(mod);
|
|
|
|
|
|
+ /* Free any allocated parameters. */
|
|
|
+ destroy_params(mod->kp, mod->num_kp);
|
|
|
+
|
|
|
/* release any pointers to mcount in this module */
|
|
|
ftrace_release(mod->module_core, mod->core_size);
|
|
|
|
|
@@ -1898,8 +1901,7 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
unsigned int symindex = 0;
|
|
|
unsigned int strindex = 0;
|
|
|
unsigned int modindex, versindex, infoindex, pcpuindex;
|
|
|
- unsigned int num_kp, num_mcount;
|
|
|
- struct kernel_param *kp;
|
|
|
+ unsigned int num_mcount;
|
|
|
struct module *mod;
|
|
|
long err = 0;
|
|
|
void *percpu = NULL, *ptr = NULL; /* Stops spurious gcc warning */
|
|
@@ -2144,8 +2146,8 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
|
|
|
/* Now we've got everything in the final locations, we can
|
|
|
* find optional sections. */
|
|
|
- kp = section_objs(hdr, sechdrs, secstrings, "__param", sizeof(*kp),
|
|
|
- &num_kp);
|
|
|
+ mod->kp = section_objs(hdr, sechdrs, secstrings, "__param",
|
|
|
+ sizeof(*mod->kp), &mod->num_kp);
|
|
|
mod->syms = section_objs(hdr, sechdrs, secstrings, "__ksymtab",
|
|
|
sizeof(*mod->syms), &mod->num_syms);
|
|
|
mod->crcs = section_addr(hdr, sechdrs, secstrings, "__kcrctab");
|
|
@@ -2291,11 +2293,11 @@ static noinline struct module *load_module(void __user *umod,
|
|
|
*/
|
|
|
list_add_rcu(&mod->list, &modules);
|
|
|
|
|
|
- err = parse_args(mod->name, mod->args, kp, num_kp, NULL);
|
|
|
+ err = parse_args(mod->name, mod->args, mod->kp, mod->num_kp, NULL);
|
|
|
if (err < 0)
|
|
|
goto unlink;
|
|
|
|
|
|
- err = mod_sysfs_setup(mod, kp, num_kp);
|
|
|
+ err = mod_sysfs_setup(mod, mod->kp, mod->num_kp);
|
|
|
if (err < 0)
|
|
|
goto unlink;
|
|
|
add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
|