diff --git a/kernel/src/syscall/mprotect.rs b/kernel/src/syscall/mprotect.rs index c06348b98..b8f04165f 100644 --- a/kernel/src/syscall/mprotect.rs +++ b/kernel/src/syscall/mprotect.rs @@ -12,7 +12,17 @@ pub fn sys_mprotect(addr: Vaddr, len: usize, perms: u64, ctx: &Context) -> Resul addr, len, vm_perms ); let root_vmar = ctx.process.root_vmar(); - debug_assert!(addr % PAGE_SIZE == 0); + + // According to linux behavior, + // , + // the addr is checked even if len is 0. + if addr % PAGE_SIZE != 0 { + return_errno_with_message!(Errno::EINVAL, "the start address should be page aligned"); + } + if len == 0 { + return Ok(SyscallReturn::Return(0)); + } + let len = len.align_up(PAGE_SIZE); let range = addr..(addr + len); root_vmar.protect(vm_perms, range)?; diff --git a/kernel/src/syscall/munmap.rs b/kernel/src/syscall/munmap.rs index 7823c3c07..9e15b850b 100644 --- a/kernel/src/syscall/munmap.rs +++ b/kernel/src/syscall/munmap.rs @@ -7,6 +7,14 @@ use crate::prelude::*; pub fn sys_munmap(addr: Vaddr, len: usize, ctx: &Context) -> Result { debug!("addr = 0x{:x}, len = {}", addr, len); + + if addr % PAGE_SIZE != 0 { + return_errno_with_message!(Errno::EINVAL, "munmap addr must be page-aligned"); + } + if len == 0 { + return_errno_with_message!(Errno::EINVAL, "munmap len cannot be zero"); + } + let root_vmar = ctx.process.root_vmar(); let len = len.align_up(PAGE_SIZE); debug!("unmap range = 0x{:x} - 0x{:x}", addr, addr + len);