|
@@ -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 */
|