diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2013-05-15 15:33:01 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2013-05-17 04:53:07 -0400 |
commit | 06c9494c0e9bdfcaa14d6d2b096a0ff7abe8494f (patch) | |
tree | 22da52e773d30408d0372eeb20f18821d2834cca | |
parent | f722406faae2d073cc1d01063d1123c35425939e (diff) |
kmemleak: Scan all allocated, writeable and not executable module sections
Instead of just picking data sections by name (names that start
with .data, .bss or .ref.data), use the section flags and scan all
sections that are allocated, writable and not executable. Which should
cover all sections of a module that might reference data.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
[catalin.marinas@arm.com: removed unused 'name' variable]
[catalin.marinas@arm.com: collapsed 'if' blocks]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Rusty Russell <rusty@rustcorp.com.au>
-rw-r--r-- | kernel/module.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/module.c b/kernel/module.c index b049939177f6..06f496a5d182 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -2431,10 +2431,10 @@ static void kmemleak_load_module(const struct module *mod, | |||
2431 | kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL); | 2431 | kmemleak_scan_area(mod, sizeof(struct module), GFP_KERNEL); |
2432 | 2432 | ||
2433 | for (i = 1; i < info->hdr->e_shnum; i++) { | 2433 | for (i = 1; i < info->hdr->e_shnum; i++) { |
2434 | const char *name = info->secstrings + info->sechdrs[i].sh_name; | 2434 | /* Scan all writable sections that's not executable */ |
2435 | if (!(info->sechdrs[i].sh_flags & SHF_ALLOC)) | 2435 | if (!(info->sechdrs[i].sh_flags & SHF_ALLOC) || |
2436 | continue; | 2436 | !(info->sechdrs[i].sh_flags & SHF_WRITE) || |
2437 | if (!strstarts(name, ".data") && !strstarts(name, ".bss")) | 2437 | (info->sechdrs[i].sh_flags & SHF_EXECINSTR)) |
2438 | continue; | 2438 | continue; |
2439 | 2439 | ||
2440 | kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, | 2440 | kmemleak_scan_area((void *)info->sechdrs[i].sh_addr, |