Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f05bde9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull kmemleak patches from Catalin Marinas:
 "Kmemleak now scans all the writable and non-executable module sections
  to avoid false positives (previously it was only scanning specific
  sections and missing .ref.data)."

* tag 'kmemleak-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux-aarch64:
  kmemleak: No need for scanning specific module sections
  kmemleak: Scan all allocated, writeable and not executable module sections
parents f71df633 89c83735
Loading
Loading
Loading
Loading
+4 −17
Original line number Original line Diff line number Diff line
@@ -2431,10 +2431,10 @@ static void kmemleak_load_module(const struct module *mod,
	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);
	kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL);


	for (i = 1; i < info->hdr->e_shnum; i++) {
	for (i = 1; i < info->hdr->e_shnum; i++) {
		const char *name = info->secstrings + info->sechdrs[i].sh_name;
		/* Scan all writable sections that's not executable */
		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC))
		if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) ||
			continue;
		    !(info->sechdrs[i].sh_flags & SHF_WRITE) ||
		if (!strstarts(name, ".data") && !strstarts(name, ".bss"))
		    (info->sechdrs[i].sh_flags & SHF_EXECINSTR))
			continue;
			continue;


		kmemleak_scan_area((void *)info->sechdrs[i].sh_addr,
		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",
	mod->trace_events = section_objs(info, "_ftrace_events",
					 sizeof(*mod->trace_events),
					 sizeof(*mod->trace_events),
					 &mod->num_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
#endif
#ifdef CONFIG_TRACING
#ifdef CONFIG_TRACING
	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
	mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
					 sizeof(*mod->trace_bprintk_fmt_start),
					 sizeof(*mod->trace_bprintk_fmt_start),
					 &mod->num_trace_bprintk_fmt);
					 &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
#endif
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
	/* sechdrs[0].sh_size is always zero */
	/* sechdrs[0].sh_size is always zero */