Skip to content

Commit 51d05ec

Browse files
committed
parse player info fix oobe
1 parent 9d1ef2f commit 51d05ec

2 files changed

Lines changed: 14 additions & 4 deletions

File tree

src/parser/src/first_pass/parser.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,18 @@ impl<'a> FirstPassParser<'a> {
9393
let mut reuseable_buffer = vec![0_u8; 100_000];
9494
// Loop that goes trough the entire file
9595
loop {
96-
if demo_bytes.len() < self.ptr {
96+
// Need at least a few bytes to read frame header (3 varints, minimum 1 byte each)
97+
if self.ptr + 3 > demo_bytes.len() {
9798
break;
9899
}
99100
if exit_early && self.cls_by_id.is_some() && !self.ge_list.is_empty() {
100101
break;
101102
}
102-
let frame = self.read_frame(demo_bytes)?;
103+
let frame = match self.read_frame(demo_bytes) {
104+
Ok(f) => f,
105+
Err(DemoParserError::OutOfBytesError) => break,
106+
Err(e) => return Err(e),
107+
};
103108
if self.is_packet_we_skip_on_first_pass(frame.demo_cmd) {
104109
self.ptr += frame.size;
105110
continue;

src/parser/src/second_pass/parser.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,15 @@ impl<'a> SecondPassParser<'a> {
6262
let mut buf = vec![0_u8; INNER_BUF_DEFAULT_LEN];
6363
let mut buf2 = vec![0_u8; OUTER_BUF_DEFAULT_LEN];
6464
loop {
65-
if demo_bytes.len() < self.ptr {
65+
// Need at least a few bytes to read frame header (3 varints, minimum 1 byte each)
66+
if self.ptr + 3 > demo_bytes.len() {
6667
break;
6768
}
68-
let frame = self.read_frame(demo_bytes)?;
69+
let frame = match self.read_frame(demo_bytes) {
70+
Ok(f) => f,
71+
Err(DemoParserError::OutOfBytesError) => break,
72+
Err(e) => return Err(e),
73+
};
6974
if frame.demo_cmd == DemAnimationData || frame.demo_cmd == DemSendTables || frame.demo_cmd == DemStringTables {
7075
self.ptr += frame.size as usize;
7176
continue;

0 commit comments

Comments
 (0)