diff options
| -rw-r--r-- | arch/cris/kernel/module.c | 2 | ||||
| -rw-r--r-- | arch/parisc/kernel/module.c | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/module.c | 4 | ||||
| -rw-r--r-- | arch/tile/kernel/module.c | 2 | ||||
| -rw-r--r-- | arch/unicore32/kernel/module.c | 3 | ||||
| -rw-r--r-- | kernel/module.c | 33 | 
6 files changed, 18 insertions, 28 deletions
diff --git a/arch/cris/kernel/module.c b/arch/cris/kernel/module.c index 37400f5869e..51123f985eb 100644 --- a/arch/cris/kernel/module.c +++ b/arch/cris/kernel/module.c @@ -32,8 +32,6 @@  #ifdef CONFIG_ETRAX_KMALLOCED_MODULES  void *module_alloc(unsigned long size)  { -	if (size == 0) -		return NULL;  	return kmalloc(size, GFP_KERNEL);  } diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 5e34ccf39a4..2a625fb063e 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c @@ -214,8 +214,6 @@ static inline int reassemble_22(int as22)  void *module_alloc(unsigned long size)  { -	if (size == 0) -		return NULL;  	/* using RWX means less protection for modules, but it's  	 * easier than trying to map the text, data, init_text and  	 * init_data correctly */ diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index f1ddc0d2367..4435488ebe2 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c @@ -43,10 +43,6 @@ void *module_alloc(unsigned long size)  {  	void *ret; -	/* We handle the zero case fine, unlike vmalloc */ -	if (size == 0) -		return NULL; -  	ret = module_map(size);  	if (ret)  		memset(ret, 0, size); diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index 243ffebe38d..4918d91bc3a 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c @@ -42,8 +42,6 @@ void *module_alloc(unsigned long size)  	int i = 0;  	int npages; -	if (size == 0) -		return NULL;  	npages = (size + PAGE_SIZE - 1) / PAGE_SIZE;  	pages = kmalloc(npages * sizeof(struct page *), GFP_KERNEL);  	if (pages == NULL) diff --git a/arch/unicore32/kernel/module.c b/arch/unicore32/kernel/module.c index 8fbe8577f5e..16bd1495b93 100644 --- a/arch/unicore32/kernel/module.c +++ b/arch/unicore32/kernel/module.c @@ -27,9 +27,6 @@ void *module_alloc(unsigned long size)  	struct vm_struct *area;  	size = PAGE_ALIGN(size); -	if (!size) -		return NULL; -  	area = __get_vm_area(size, VM_ALLOC, MODULES_VADDR, MODULES_END);  	if (!area)  		return NULL; diff --git a/kernel/module.c b/kernel/module.c index 79a526dd1b1..4542ff3f7ef 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -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");  |