|
@@ -2377,7 +2377,7 @@ static void dynamic_debug_remove(struct _ddebug *debug)
|
|
|
|
|
|
void * __weak module_alloc(unsigned long size)
|
|
|
{
|
|
|
- return size == 0 ? NULL : vmalloc_exec(size);
|
|
|
+ return vmalloc_exec(size);
|
|
|
}
|
|
|
|
|
|
static void *module_alloc_update_bounds(unsigned long size)
|
|
@@ -2793,20 +2793,23 @@ static int move_module(struct module *mod, struct load_info *info)
|
|
|
memset(ptr, 0, mod->core_size);
|
|
|
mod->module_core = ptr;
|
|
|
|
|
|
- ptr = module_alloc_update_bounds(mod->init_size);
|
|
|
- /*
|
|
|
- * The pointer to this block is stored in the module structure
|
|
|
- * which is inside the block. This block doesn't need to be
|
|
|
- * scanned as it contains data and code that will be freed
|
|
|
- * after the module is initialized.
|
|
|
- */
|
|
|
- kmemleak_ignore(ptr);
|
|
|
- if (!ptr && mod->init_size) {
|
|
|
- module_free(mod, mod->module_core);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
- memset(ptr, 0, mod->init_size);
|
|
|
- mod->module_init = ptr;
|
|
|
+ if (mod->init_size) {
|
|
|
+ ptr = module_alloc_update_bounds(mod->init_size);
|
|
|
+ /*
|
|
|
+ * The pointer to this block is stored in the module structure
|
|
|
+ * which is inside the block. This block doesn't need to be
|
|
|
+ * scanned as it contains data and code that will be freed
|
|
|
+ * after the module is initialized.
|
|
|
+ */
|
|
|
+ kmemleak_ignore(ptr);
|
|
|
+ if (!ptr) {
|
|
|
+ module_free(mod, mod->module_core);
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+ memset(ptr, 0, mod->init_size);
|
|
|
+ mod->module_init = ptr;
|
|
|
+ } else
|
|
|
+ mod->module_init = NULL;
|
|
|
|
|
|
/* Transfer each section which specifies SHF_ALLOC */
|
|
|
pr_debug("final section addresses:\n");
|