[libos] Return error instead of overflow panic in vm
This commit is contained in:
		
							parent
							
								
									cd5c913dc7
								
							
						
					
					
						commit
						64bdd71a50
					
				| @ -74,14 +74,14 @@ impl VMManager { | |||||||
|         match addr { |         match addr { | ||||||
|             VMMapAddr::Any => {} |             VMMapAddr::Any => {} | ||||||
|             VMMapAddr::Hint(addr) => { |             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); |                 let ret = self.mmap_with_addr(target_range, options); | ||||||
|                 if ret.is_ok() { |                 if ret.is_ok() { | ||||||
|                     return ret; |                     return ret; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             VMMapAddr::Need(addr) | VMMapAddr::Force(addr) => { |             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); |                 return self.mmap_with_addr(target_range, options); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -237,7 +237,7 @@ impl VMManager { | |||||||
|             } |             } | ||||||
|             align_up(size, PAGE_SIZE) |             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 chunk = { | ||||||
|             let current = current!(); |             let current = current!(); | ||||||
|             let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); |             let process_mem_chunks = current.vm().mem_chunks().read().unwrap(); | ||||||
|  | |||||||
| @ -18,7 +18,10 @@ impl VMRange { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn new_with_size(start: usize, size: usize) -> Result<VMRange> { |     pub fn new_with_size(start: usize, size: usize) -> Result<VMRange> { | ||||||
|         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<VMRange> { |     pub fn new_empty(start: usize) -> Result<VMRange> { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user