From 64bdd71a509ec303df7f1ee9c994440bbe07088e Mon Sep 17 00:00:00 2001 From: Shaowei Song <1498430017@qq.com> Date: Thu, 24 Mar 2022 12:15:31 +0800 Subject: [PATCH] [libos] Return error instead of overflow panic in vm --- src/libos/src/vm/vm_manager.rs | 6 +++--- src/libos/src/vm/vm_range.rs | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/libos/src/vm/vm_manager.rs b/src/libos/src/vm/vm_manager.rs index 5ac5122b..0afb6a26 100644 --- a/src/libos/src/vm/vm_manager.rs +++ b/src/libos/src/vm/vm_manager.rs @@ -74,14 +74,14 @@ impl VMManager { match addr { VMMapAddr::Any => {} VMMapAddr::Hint(addr) => { - let target_range = VMRange::new(addr, addr + size)?; + let target_range = VMRange::new_with_size(addr, size)?; let ret = self.mmap_with_addr(target_range, options); if ret.is_ok() { return ret; } } VMMapAddr::Need(addr) | VMMapAddr::Force(addr) => { - let target_range = VMRange::new(addr, addr + size)?; + let target_range = VMRange::new_with_size(addr, size)?; return self.mmap_with_addr(target_range, options); } } @@ -237,7 +237,7 @@ impl VMManager { } align_up(size, PAGE_SIZE) }; - let munmap_range = { VMRange::new(addr, addr + size) }?; + let munmap_range = { VMRange::new_with_size(addr, size) }?; let chunk = { let current = current!(); let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); diff --git a/src/libos/src/vm/vm_range.rs b/src/libos/src/vm/vm_range.rs index 3e0876ff..c8f8ac7e 100644 --- a/src/libos/src/vm/vm_range.rs +++ b/src/libos/src/vm/vm_range.rs @@ -18,7 +18,10 @@ impl VMRange { } pub fn new_with_size(start: usize, size: usize) -> Result { - Self::new(start, start + size) + let end = start + .checked_add(size) + .ok_or_else(|| errno!(EINVAL, "end address overflow"))?; + Self::new(start, end) } pub fn new_empty(start: usize) -> Result {