diff --git a/mm/kmemleak.c b/mm/kmemleak.c index f9d9dc250428..5354e74f0d19 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -437,6 +437,8 @@ static struct kmemleak_object *lookup_object(unsigned long ptr, int alias) { struct rb_node *rb = object_tree_root.rb_node; + ptr = (unsigned long)kasan_reset_tag((void *)ptr); + while (rb) { struct kmemleak_object *object = rb_entry(rb, struct kmemleak_object, rb_node); @@ -575,6 +577,8 @@ static struct kmemleak_object *create_object(unsigned long ptr, size_t size, struct kmemleak_object *object, *parent; struct rb_node **link, *rb_parent; + ptr = (unsigned long)kasan_reset_tag((void *)ptr); + object = kmem_cache_alloc(object_cache, gfp_kmemleak_mask(gfp)); if (!object) { pr_warn("Cannot allocate a kmemleak_object structure\n"); @@ -701,6 +705,8 @@ static void delete_object_part(unsigned long ptr, size_t size) struct kmemleak_object *object; unsigned long start, end; + ptr = (unsigned long)kasan_reset_tag((void *)ptr); + object = find_and_remove_object(ptr, 1); if (!object) { #ifdef DEBUG @@ -789,6 +795,8 @@ static void add_scan_area(unsigned long ptr, size_t size, gfp_t gfp) struct kmemleak_object *object; struct kmemleak_scan_area *area; + ptr = (unsigned long)kasan_reset_tag((void *)ptr); + object = find_and_get_object(ptr, 1); if (!object) { kmemleak_warn("Adding scan area to unknown object at 0x%08lx\n", @@ -1334,6 +1342,9 @@ static void scan_block(void *_start, void *_end, unsigned long *end = _end - (BYTES_PER_POINTER - 1); unsigned long flags; + start = (unsigned long *)kasan_reset_tag((void *)start); + end = (unsigned long *)kasan_reset_tag((void *)end); + read_lock_irqsave(&kmemleak_lock, flags); for (ptr = start; ptr < end; ptr++) { struct kmemleak_object *object; @@ -1344,7 +1355,7 @@ static void scan_block(void *_start, void *_end, break; kasan_disable_current(); - pointer = *ptr; + pointer = (unsigned long)kasan_reset_tag((void *)*ptr); kasan_enable_current(); if (pointer < min_addr || pointer >= max_addr)