mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-27 12:48:22 +00:00
vmm: properly release lock on request failure
This commit is contained in:
+8
-6
@@ -530,6 +530,7 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){
|
|||||||
|
|
||||||
spinlock_acquire(lock);
|
spinlock_acquire(lock);
|
||||||
|
|
||||||
|
|
||||||
bool status;
|
bool status;
|
||||||
vmm_mapping* map = findmappingfromaddr(*start, addr);
|
vmm_mapping* map = findmappingfromaddr(*start, addr);
|
||||||
void* paddr;
|
void* paddr;
|
||||||
@@ -554,11 +555,12 @@ bool vmm_dealwithrequest(void* addr, long error, bool user){
|
|||||||
goodmmuflags |= ARCH_MMU_MAP_NOEXEC;
|
goodmmuflags |= ARCH_MMU_MAP_NOEXEC;
|
||||||
|
|
||||||
|
|
||||||
if(goodmmuflags != (map->mmuflags & goodmmuflags))
|
if(goodmmuflags != (map->mmuflags & goodmmuflags)){
|
||||||
return false;
|
status = false;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// allocate a page
|
// allocate a page
|
||||||
|
|
||||||
addr = (size_t)addr & ~(0xFFF);
|
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){
|
if(addr == NULL || arch_mmu_map(cls->context->context, paddr, addr, map->mmuflags) == false){
|
||||||
status = false;
|
status = false;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = true;
|
status = true;
|
||||||
|
|
||||||
memset(addr, 0, PAGE_SIZE);
|
memset(addr, 0, PAGE_SIZE);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
||||||
spinlock_release(lock);
|
spinlock_release(lock);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|||||||
Reference in New Issue
Block a user