Skip to content

Commit 871efe6

Browse files
author
David James
committed
fix: limit seek distance (arbitrarily) to 1 exabyte.
This likely fixes many fuzzing errors, many of which involve large seek distances (e.g. close to 2 ** 64). There may be better ways to address such fuzzing errors while preserving the full seekable range. I admit this is a rather uninspiring defensive move.
1 parent 7202c33 commit 871efe6

File tree

1 file changed

+12
-0
lines changed

1 file changed

+12
-0
lines changed

src/seek.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,35 @@ use std::io::{Read, Seek, SeekFrom, Write};
55

66
use super::CrcStore;
77

8+
/// Maximum seek is arbitrarily set to 1 exabyte (1000 ^ 6).
9+
const MAX_SEEK: i64 = 1_000_000_000_000_000_000;
10+
811
impl<I: Read + Write + Seek> Seek for CrcStore<I> {
912
/// Seek according to given outer position.
1013
fn seek(&mut self, outer_pos: SeekFrom) -> IoResult<u64> {
1114
let inner_pos: SeekFrom = match outer_pos {
1215
SeekFrom::Start(outer_n) => {
16+
if outer_n >= MAX_SEEK as u64 {
17+
return Err(IoError::new(InvalidInput, "exceeded MAX_SEEK_FROM_START"));
18+
}
1319
let inner_n: u64 = self
1420
.start_pos(outer_n)
1521
.ok_or_else(|| IoError::new(InvalidInput, "checked arithmetic"))?;
1622
SeekFrom::Start(inner_n)
1723
}
1824
SeekFrom::Current(outer_n) => {
25+
if outer_n >= MAX_SEEK || outer_n <= -MAX_SEEK {
26+
return Err(IoError::new(InvalidInput, "exceeded MAX_SEEK"));
27+
}
1928
let inner_n: i64 = self
2029
.current_pos(outer_n)
2130
.ok_or_else(|| IoError::new(InvalidInput, "checked arithmetic"))?;
2231
SeekFrom::Current(inner_n)
2332
}
2433
SeekFrom::End(outer_n) => {
34+
if outer_n >= MAX_SEEK || outer_n <= -MAX_SEEK {
35+
return Err(IoError::new(InvalidInput, "exceeded MAX_SEEK"));
36+
}
2537
let inner_n: i64 = self
2638
.end_pos(-outer_n)
2739
.ok_or_else(|| IoError::new(InvalidInput, "checked arithmetic"))?;

0 commit comments

Comments
 (0)