From 939feacdc56e1e0c701d628a96223f9db9da4cc1 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Tue, 26 Jul 2022 20:57:33 +0200 Subject: [PATCH] Add fn for validating user memory range bounds. --- src/syscall/validate.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/syscall/validate.rs b/src/syscall/validate.rs index f4a0554..51f7b5e 100644 --- a/src/syscall/validate.rs +++ b/src/syscall/validate.rs @@ -5,6 +5,7 @@ use core::{mem, slice, str}; use crate::context; +use crate::memory::PAGE_SIZE; use crate::paging::{Page, TableKind, VirtualAddress}; use crate::syscall::error::*; @@ -108,3 +109,13 @@ pub fn validate_str(ptr: *const u8, len: usize) -> Result<&'static str> { let slice = validate_slice(ptr, len)?; str::from_utf8(slice).map_err(|_| Error::new(EINVAL)) } + +pub fn validate_region(address: usize, size: usize) -> Result<(Page, usize)> { + if address % PAGE_SIZE != 0 || size % PAGE_SIZE != 0 || size == 0 { + return Err(Error::new(EINVAL)); + } + if address.saturating_add(size) > crate::USER_END_OFFSET { + return Err(Error::new(EFAULT)); + } + Ok((Page::containing_address(VirtualAddress::new(address)), size / PAGE_SIZE)) +}