From bc49ea97bb61bbe55af3e847a88a649d04a93777 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Wed, 20 Jul 2022 17:26:25 +0200 Subject: user/elf: free memory not belonging to the elf when jumping to it --- src/kernel/syscalls.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/kernel/syscalls.c') diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index a2ae5dd..f884fd3 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -317,6 +317,11 @@ void __user *_syscall_memflag(void __user *addr, size_t len, int flags) { SYSCALL_RETURN((uintptr_t)addr); } + if (!(flags & MEMFLAG_PRESENT)) { + pagedir_unmap_user(pages, addr, len); + SYSCALL_RETURN((uintptr_t)addr); + } + for (userptr_t iter = addr; iter < addr + len; iter += PAGE_SIZE) { if (pagedir_iskern(pages, iter)) { @@ -325,13 +330,6 @@ void __user *_syscall_memflag(void __user *addr, size_t len, int flags) { } phys = pagedir_virt2phys(pages, iter, false, false); - - if (!(flags & MEMFLAG_PRESENT)) { - if (phys) - page_free(pagedir_unmap(pages, iter), 1); - continue; - } - if (!phys) { phys = page_alloc(1); memset(phys, 0, PAGE_SIZE); // TODO somehow test this -- cgit v1.2.3