Skip to content

Commit 56ea3eb

Browse files
committed
fix: skip consecutive invalid bytes and file size validation
1 parent 77f9df8 commit 56ea3eb

2 files changed

Lines changed: 33 additions & 2 deletions

File tree

src/mmap.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,31 @@ pub struct MmapParser {
1111
mmap: Mmap,
1212
}
1313

14+
const MAX_MMAP_SIZE: u64 = 16 * 1024 * 1024 * 1024;
15+
1416
impl MmapParser {
1517
pub fn open<P: AsRef<Path>>(path: P) -> io::Result<Self> {
16-
let file = File::open(path)?;
18+
let file = File::open(&path)?;
19+
let metadata = file.metadata()?;
20+
21+
if metadata.len() > MAX_MMAP_SIZE {
22+
return Err(io::Error::new(
23+
io::ErrorKind::InvalidData,
24+
format!(
25+
"File too large for mmap: {} bytes (max {})",
26+
metadata.len(),
27+
MAX_MMAP_SIZE
28+
),
29+
));
30+
}
31+
32+
if metadata.len() == 0 {
33+
return Err(io::Error::new(
34+
io::ErrorKind::InvalidData,
35+
"Cannot mmap empty file",
36+
));
37+
}
38+
1739
let mmap = unsafe { Mmap::map(&file)? };
1840
Ok(Self { mmap })
1941
}

src/simd.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1854,7 +1854,16 @@ pub fn validate_message_stream_simd(data: &[u8], max_errors: usize) -> Validatio
18541854
if result.error_offsets.len() >= max_errors {
18551855
break;
18561856
}
1857-
offset += 1;
1857+
if msg_len == 0 {
1858+
let skip = data[offset..]
1859+
.iter()
1860+
.take_while(|&&b| b == 0)
1861+
.count()
1862+
.max(1);
1863+
offset += skip;
1864+
} else {
1865+
offset += 1;
1866+
}
18581867
continue;
18591868
}
18601869

0 commit comments

Comments
 (0)