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