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> { |     fn seek(&self, pos: SeekFrom) -> Result<off_t> { | ||||||
|         let mut offset = self.offset.lock().unwrap(); |         let mut offset = self.offset.lock().unwrap(); | ||||||
|         *offset = match pos { |         let new_offset = match pos { | ||||||
|             SeekFrom::Start(off) => off as usize, |             SeekFrom::Start(off) => off as i64, | ||||||
|             SeekFrom::End(off) => (self.inode.metadata()?.size as i64 + off) as usize, |             SeekFrom::End(off) => (self.inode.metadata()?.size as i64) | ||||||
|             SeekFrom::Current(off) => (*offset as i64 + off) as usize, |                 .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) |         Ok(*offset as i64) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user