From b3f0ca7cd69dbaf2b16f4e80e5cbe67f2dff0641 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 11 Sep 2022 12:53:41 -0300 Subject: [PATCH] vmm: properly release lock on request failure --- src/sys/mm/vmm.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sys/mm/vmm.c b/src/sys/mm/vmm.c index 43287f30..4bf9eee6 100644 --- a/src/sys/mm/vmm.c +++ b/src/sys/mm/vmm.c @@ -530,6 +530,7 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){ spinlock_acquire(lock); + bool status; vmm_mapping* map = findmappingfromaddr(*start, addr); void* paddr; @@ -554,11 +555,12 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){ goodmmuflags |= ARCH_MMU_MAP_NOEXEC; - if(goodmmuflags != (map->mmuflags & goodmmuflags)) - return false; + if(goodmmuflags != (map->mmuflags & goodmmuflags)){ + status = false; + goto done; + } - // allocate a page addr = (size_t)addr & ~(0xFFF); @@ -574,16 +576,16 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){ if(addr == NULL || arch_mmu_map(cls->context->context, paddr, addr, map->mmuflags) == false){ - status = false; + status = false; goto done; } status = true; memset(addr, 0, PAGE_SIZE); - + done: - + spinlock_release(lock); return status;