After ms commit ad1a3e15fcd3b ("kmemleak: fix kmemleak false positive report with HW tag-based kasan enable") [1], the untagged_ptr is also used in rbtree search loop, the patch [2] was not correctly updated in rebase, so untagged_ptr is used uninitialized in percpu case.
Fix it by always setting untagged_ptr. Also, while on it, also use untagged_ptr for min/max_percpu_addr. https://virtuozzo.atlassian.net/browse/PSBM-156004 Fixes: c9438a892d597 ("mm/kmemleak: Add support for percpu memory leak detect") [2] Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> --- mm/kmemleak.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index d1a5d27e5269b..8e5f957ba71ef 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -685,11 +685,11 @@ static void __create_object(unsigned long ptr, size_t size, raw_spin_lock_irqsave(&kmemleak_lock, flags); + untagged_ptr = (unsigned long)kasan_reset_tag((void *)ptr); if (object->flags & OBJECT_PERCPU) { - min_percpu_addr = min(min_percpu_addr, ptr); - max_percpu_addr = max(max_percpu_addr, ptr + size); + min_percpu_addr = min(min_percpu_addr, untagged_ptr); + max_percpu_addr = max(max_percpu_addr, untagged_ptr + size); } else { - untagged_ptr = (unsigned long)kasan_reset_tag((void *)ptr); /* * Only update min_addr and max_addr with object * storing virtual address. @@ -1342,11 +1342,11 @@ static void add_pointer_to_gray_list(struct kmemleak_object *scanned, unsigned l unsigned long untagged_ptr; unsigned long excess_ref; + untagged_ptr = (unsigned long)kasan_reset_tag((void *)pointer); if (pcpu) { - if (pointer < min_percpu_addr || pointer >= max_percpu_addr) + if (untagged_ptr < min_percpu_addr || untagged_ptr >= max_percpu_addr) return; } else { - untagged_ptr = (unsigned long)kasan_reset_tag((void *)pointer); if (untagged_ptr < min_addr || untagged_ptr >= max_addr) return; } -- 2.45.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel