Fix potential overflow or underflow of offset in INodeFile's seek
This commit is contained in:
		
							parent
							
								
									449ba1d5d9
								
							
						
					
					
						commit
						d825351f02
					
				| @ -96,11 +96,19 @@ impl File for INodeFile { | ||||
| 
 | ||||
|     fn seek(&self, pos: SeekFrom) -> Result<off_t> { | ||||
|         let mut offset = self.offset.lock().unwrap(); | ||||
|         *offset = match pos { | ||||
|             SeekFrom::Start(off) => off as usize, | ||||
|             SeekFrom::End(off) => (self.inode.metadata()?.size as i64 + off) as usize, | ||||
|             SeekFrom::Current(off) => (*offset as i64 + off) as usize, | ||||
|         let new_offset = match pos { | ||||
|             SeekFrom::Start(off) => off as i64, | ||||
|             SeekFrom::End(off) => (self.inode.metadata()?.size as i64) | ||||
|                 .checked_add(off) | ||||
|                 .ok_or_else(|| errno!(EOVERFLOW, "file offset overflow"))?, | ||||
|             SeekFrom::Current(off) => (*offset as i64) | ||||
|                 .checked_add(off) | ||||
|                 .ok_or_else(|| errno!(EOVERFLOW, "file offset overflow"))?, | ||||
|         }; | ||||
|         if new_offset < 0 { | ||||
|             return_errno!(EINVAL, "file offset is negative"); | ||||
|         } | ||||
|         *offset = new_offset as usize; | ||||
|         Ok(*offset as i64) | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user