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 {