Skip to content

Commit 21a4ccd

Browse files
committed
Add bounds checking to x86_64 disassembler read helpers
Prevent panics when disassembling truncated or short byte sequences. Return 0 for out-of-bounds reads instead of panicking.
1 parent 6bdd22a commit 21a4ccd

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

zjit/src/disasm_x86_64.rs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -456,23 +456,31 @@ impl<'a> DisassemblerX64<'a> {
456456

457457
// -- Read helpers --
458458
fn peek(&self) -> u8 {
459-
self.code[self.pos]
459+
if self.pos < self.code.len() {
460+
self.code[self.pos]
461+
} else {
462+
0
463+
}
460464
}
461465

462466
fn read_u8(&mut self) -> u8 {
463-
let v = self.code[self.pos];
464-
self.pos += 1;
465-
v
467+
if self.pos < self.code.len() {
468+
let v = self.code[self.pos];
469+
self.pos += 1;
470+
v
471+
} else {
472+
self.pos += 1;
473+
0
474+
}
466475
}
467476

468477
fn read_i8(&mut self) -> i8 {
469478
self.read_u8() as i8
470479
}
471480

472481
fn read_u16_le(&mut self) -> u16 {
473-
let lo = self.code[self.pos] as u16;
474-
let hi = self.code[self.pos + 1] as u16;
475-
self.pos += 2;
482+
let lo = self.read_u8() as u16;
483+
let hi = self.read_u8() as u16;
476484
lo | (hi << 8)
477485
}
478486

@@ -481,19 +489,21 @@ impl<'a> DisassemblerX64<'a> {
481489
}
482490

483491
fn read_u32_le(&mut self) -> u32 {
484-
let b = &self.code[self.pos..self.pos + 4];
485-
self.pos += 4;
486-
u32::from_le_bytes([b[0], b[1], b[2], b[3]])
492+
let b0 = self.read_u8() as u32;
493+
let b1 = self.read_u8() as u32;
494+
let b2 = self.read_u8() as u32;
495+
let b3 = self.read_u8() as u32;
496+
b0 | (b1 << 8) | (b2 << 16) | (b3 << 24)
487497
}
488498

489499
fn read_i32_le(&mut self) -> i32 {
490500
self.read_u32_le() as i32
491501
}
492502

493503
fn read_i64_le(&mut self) -> i64 {
494-
let b = &self.code[self.pos..self.pos + 8];
495-
self.pos += 8;
496-
i64::from_le_bytes([b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]])
504+
let lo = self.read_u32_le() as u64;
505+
let hi = self.read_u32_le() as u64;
506+
(lo | (hi << 32)) as i64
497507
}
498508

499509
fn peek_i8_at(&self, offset: usize) -> i8 {

0 commit comments

Comments
 (0)