diff options
Diffstat (limited to '')
| -rw-r--r-- | kernel/module.c | 23 | 
1 files changed, 11 insertions, 12 deletions
| diff --git a/kernel/module.c b/kernel/module.c index 81e727cf6df9..03214bd288e9 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -60,7 +60,6 @@  #include <linux/jump_label.h>  #include <linux/pfn.h>  #include <linux/bsearch.h> -#include <linux/fips.h>  #include <uapi/linux/module.h>  #include "module-internal.h" @@ -2448,9 +2447,6 @@ static int module_sig_check(struct load_info *info)  	}  	/* Not having a signature is only an error if we're strict. */ -	if (err < 0 && fips_enabled) -		panic("Module verification failed with error %d in FIPS mode\n", -		      err);  	if (err == -ENOKEY && !sig_enforce)  		err = 0; @@ -3308,6 +3304,11 @@ static int load_module(struct load_info *info, const char __user *uargs,  	mutex_lock(&module_mutex);  	module_bug_cleanup(mod);  	mutex_unlock(&module_mutex); + +	/* we can't deallocate the module until we clear memory protection */ +	unset_module_init_ro_nx(mod); +	unset_module_core_ro_nx(mod); +   ddebug_cleanup:  	dynamic_debug_remove(info->debug);  	synchronize_sched(); @@ -3385,6 +3386,8 @@ static inline int within(unsigned long addr, void *start, unsigned long size)   */  static inline int is_arm_mapping_symbol(const char *str)  { +	if (str[0] == '.' && str[1] == 'L') +		return true;  	return str[0] == '$' && strchr("atd", str[1])  	       && (str[2] == '\0' || str[2] == '.');  } @@ -3448,8 +3451,7 @@ const char *module_address_lookup(unsigned long addr,  	list_for_each_entry_rcu(mod, &modules, list) {  		if (mod->state == MODULE_STATE_UNFORMED)  			continue; -		if (within_module_init(addr, mod) || -		    within_module_core(addr, mod)) { +		if (within_module(addr, mod)) {  			if (modname)  				*modname = mod->name;  			ret = get_ksymbol(mod, addr, size, offset); @@ -3473,8 +3475,7 @@ int lookup_module_symbol_name(unsigned long addr, char *symname)  	list_for_each_entry_rcu(mod, &modules, list) {  		if (mod->state == MODULE_STATE_UNFORMED)  			continue; -		if (within_module_init(addr, mod) || -		    within_module_core(addr, mod)) { +		if (within_module(addr, mod)) {  			const char *sym;  			sym = get_ksymbol(mod, addr, NULL, NULL); @@ -3499,8 +3500,7 @@ int lookup_module_symbol_attrs(unsigned long addr, unsigned long *size,  	list_for_each_entry_rcu(mod, &modules, list) {  		if (mod->state == MODULE_STATE_UNFORMED)  			continue; -		if (within_module_init(addr, mod) || -		    within_module_core(addr, mod)) { +		if (within_module(addr, mod)) {  			const char *sym;  			sym = get_ksymbol(mod, addr, size, offset); @@ -3764,8 +3764,7 @@ struct module *__module_address(unsigned long addr)  	list_for_each_entry_rcu(mod, &modules, list) {  		if (mod->state == MODULE_STATE_UNFORMED)  			continue; -		if (within_module_core(addr, mod) -		    || within_module_init(addr, mod)) +		if (within_module(addr, mod))  			return mod;  	}  	return NULL; | 
