diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 3 | ||||
| -rw-r--r-- | kernel/module.c | 24 | 
2 files changed, 27 insertions, 0 deletions
| diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 724970a25666..c59ae1af02b3 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt @@ -2301,6 +2301,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.  			Note that if CONFIG_MODULE_SIG_FORCE is set, that  			is always true, so this option does nothing. +	module_blacklist=  [KNL] Do not load a comma-separated list of +			modules.  Useful for debugging problem modules. +  	mousedev.tap_time=  			[MOUSE] Maximum time between finger touching and  			leaving touchpad surface for touch to be considered diff --git a/kernel/module.c b/kernel/module.c index beaebea627ff..c91c2fdca2e6 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -3168,6 +3168,27 @@ int __weak module_frob_arch_sections(Elf_Ehdr *hdr,  	return 0;  } +/* module_blacklist is a comma-separated list of module names */ +static char *module_blacklist; +static bool blacklisted(char *module_name) +{ +	const char *p; +	size_t len; + +	if (!module_blacklist) +		return false; + +	for (p = module_blacklist; *p; p += len) { +		len = strcspn(p, ","); +		if (strlen(module_name) == len && !memcmp(module_name, p, len)) +			return true; +		if (p[len] == ',') +			len++; +	} +	return false; +} +core_param(module_blacklist, module_blacklist, charp, 0400); +  static struct module *layout_and_allocate(struct load_info *info, int flags)  {  	/* Module within temporary copy. */ @@ -3178,6 +3199,9 @@ static struct module *layout_and_allocate(struct load_info *info, int flags)  	if (IS_ERR(mod))  		return mod; +	if (blacklisted(mod->name)) +		return ERR_PTR(-EPERM); +  	err = check_modinfo(mod, info, flags);  	if (err)  		return ERR_PTR(err); | 
