diff --git a/mm/mm_heap/mm_initialize.c b/mm/mm_heap/mm_initialize.c index 6dd2f3dbf59..767cf38b494 100644 --- a/mm/mm_heap/mm_initialize.c +++ b/mm/mm_heap/mm_initialize.c @@ -141,10 +141,6 @@ void mm_addregion(FAR struct mm_heap_s *heap, FAR void *heapstart, memset(heapstart, MM_INIT_MAGIC, heapsize); #endif - /* Register to KASan for access check */ - - kasan_register(heapstart, &heapsize); - /* Adjust the provided heap start and size. * * Note: (uintptr_t)node + MM_SIZEOF_ALLOCNODE is what's actually @@ -154,7 +150,15 @@ void mm_addregion(FAR struct mm_heap_s *heap, FAR void *heapstart, heapbase = MM_ALIGN_UP((uintptr_t)heapstart + 2 * MM_SIZEOF_ALLOCNODE) - 2 * MM_SIZEOF_ALLOCNODE; - heapend = MM_ALIGN_DOWN((uintptr_t)heapstart + (uintptr_t)heapsize); + heapsize = heapsize - (heapbase - (uintptr_t)heapstart); + + /* Register KASan for access rights check. We need to register after + * address alignment. + */ + + kasan_register((void *)heapbase, &heapsize); + + heapend = MM_ALIGN_DOWN((uintptr_t)heapbase + (uintptr_t)heapsize); heapsize = heapend - heapbase; #if defined(CONFIG_FS_PROCFS) && \