Fix potential overflow or underflow of offset in INodeFile's seek

This commit is contained in:
LI Qing 2020-01-17 09:55:38 +00:00 committed by Tate, Hongliang Tian
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)
} }