From 2f359aeacfab19f18c3a55b92c45fd0753408603 Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Tue, 12 Oct 2021 14:36:30 +0200 Subject: [PATCH] mmu: fix virt_region_alloc() unused region free when aligned In the case where the aligned memory range is on top of the allocated memory range, freeing the 0 sized top unused memory will trigger an assert in the virt_region_free() call since vaddr could be equal to Z_VIRT_REGION_END_ADDR. Signed-off-by: Neil Armstrong --- kernel/mmu.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/mmu.c b/kernel/mmu.c index 5e5f78b8a6f..e7c090f3840 100644 --- a/kernel/mmu.c +++ b/kernel/mmu.c @@ -313,8 +313,10 @@ static void *virt_region_alloc(size_t size, size_t align) /* Free the two unused regions */ virt_region_free(UINT_TO_POINTER(dest_addr), aligned_dest_addr - dest_addr); - virt_region_free(UINT_TO_POINTER(aligned_dest_addr + size), - (dest_addr + alloc_size) - (aligned_dest_addr + size)); + if (((dest_addr + alloc_size) - (aligned_dest_addr + size)) > 0) { + virt_region_free(UINT_TO_POINTER(aligned_dest_addr + size), + (dest_addr + alloc_size) - (aligned_dest_addr + size)); + } dest_addr = aligned_dest_addr; }