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