[Devel] [PATCH RHEL7 COMMIT] ms/kasan: fix kmemleak false-positive in kasan_module_alloc()

Konstantin Khorenko khorenko at virtuozzo.com
Wed Nov 18 07:06:20 PST 2015


The commit is pushed to "branch-rh7-3.10.0-229.7.2.vz7.9.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-229.7.2.vz7.9.10
------>
commit b4af9dcfb3def9624d8671922c030c2cd4ce2da0
Author: Andrey Ryabinin <aryabinin at virtuozzo.com>
Date:   Wed Nov 18 19:06:20 2015 +0400

    ms/kasan: fix kmemleak false-positive in kasan_module_alloc()
    
    Kmemleak reports the following leak:
    	unreferenced object 0xfffffbfff41ea000 (size 20480):
    	comm "modprobe", pid 65199, jiffies 4298875551 (age 542.568s)
    	hex dump (first 32 bytes):
    	  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    	  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    	backtrace:
    	  [<ffffffff82354f5e>] kmemleak_alloc+0x4e/0xc0
    	  [<ffffffff8152e718>] __vmalloc_node_range+0x4b8/0x740
    	  [<ffffffff81574072>] kasan_module_alloc+0x72/0xc0
    	  [<ffffffff810efe68>] module_alloc+0x78/0xb0
    	  [<ffffffff812f6a24>] module_alloc_update_bounds+0x14/0x70
    	  [<ffffffff812f8184>] layout_and_allocate+0x16f4/0x3c90
    	  [<ffffffff812faa1f>] load_module+0x2ff/0x6690
    	  [<ffffffff813010b6>] SyS_finit_module+0x136/0x170
    	  [<ffffffff8239bbc9>] system_call_fastpath+0x16/0x1b
    	  [<ffffffffffffffff>] 0xffffffffffffffff
    
    kasan_module_alloc() allocates shadow memory for module and frees it on module
    unloading. But it doesn't store the pointer to allocated shadow memory because
    it could be calculated from the shadowed address, i.e. kasan_mem_to_shadow(addr).
    Since kmemleak cannot find pointer to allocated shadow, it thinks that memory leaked.
    Use kmemleak_ignore() to tell kmemleak that this is not a leak and this memory
    doesn't contain any pointers.
    
    https://lkml.org/lkml/2015/11/18/200
    
    https://jira.sw.ru/browse/PSBM-41328
    
    Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
 mm/kasan/kasan.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c
index d6798bc..a00c6a7 100644
--- a/mm/kasan/kasan.c
+++ b/mm/kasan/kasan.c
@@ -19,6 +19,7 @@
 #include <linux/export.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/kmemleak.h>
 #include <linux/memblock.h>
 #include <linux/memory.h>
 #include <linux/mm.h>
@@ -425,6 +426,7 @@ int kasan_module_alloc(void *addr, size_t size)
 
 	if (ret) {
 		find_vm_area(addr)->flags |= VM_KASAN;
+		kmemleak_ignore(ret);
 		return 0;
 	}
 


More information about the Devel mailing list