diff options
Diffstat (limited to 'kernel/module.c')
| -rw-r--r-- | kernel/module.c | 21 | 
1 files changed, 4 insertions, 17 deletions
diff --git a/kernel/module.c b/kernel/module.c index b049939177f6..cab4bce49c23 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -2431,10 +2431,10 @@ static void kmemleak_load_module(const struct module *mod,  	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);  	for (i = 1; i < info->hdr->e_shnum; i++) { -		const char *name = info->secstrings + info->sechdrs[i].sh_name; -		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC)) -			continue; -		if (!strstarts(name, ".data") && !strstarts(name, ".bss")) +		/* Scan all writable sections that's not executable */ +		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) || +		    !(info->sechdrs[i].sh_flags & SHF_WRITE) || +		    (info->sechdrs[i].sh_flags & SHF_EXECINSTR))  			continue;  		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, @@ -2769,24 +2769,11 @@ static void find_module_sections(struct module *mod, struct load_info *info)  	mod->trace_events = section_objs(info, "_ftrace_events",  					 sizeof(*mod->trace_events),  					 &mod->num_trace_events); -	/* -	 * This section contains pointers to allocated objects in the trace -	 * code and not scanning it leads to false positives. -	 */ -	kmemleak_scan_area(mod->trace_events, sizeof(*mod->trace_events) * -			   mod->num_trace_events, GFP_KERNEL);  #endif  #ifdef CONFIG_TRACING  	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",  					 sizeof(*mod->trace_bprintk_fmt_start),  					 &mod->num_trace_bprintk_fmt); -	/* -	 * This section contains pointers to allocated objects in the trace -	 * code and not scanning it leads to false positives. -	 */ -	kmemleak_scan_area(mod->trace_bprintk_fmt_start, -			   sizeof(*mod->trace_bprintk_fmt_start) * -			   mod->num_trace_bprintk_fmt, GFP_KERNEL);  #endif  #ifdef CONFIG_FTRACE_MCOUNT_RECORD  	/* sechdrs[0].sh_size is always zero */  |