Skip to content

Commit 89106d0

Browse files
committed
Clamp inferred jump table sizes to section size
Fixes #121
1 parent 46e6052 commit 89106d0

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

src/analysis/mod.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,19 @@ fn get_jump_table_entries(
155155
.and_then(|(_, s)| if s.size_known { NonZeroU32::new(s.size as u32) } else { None });
156156

157157
if let Some(size) = known_size.or(size).map(|n| n.get()) {
158+
let end = (addr.address + size).min((section.address + section.size) as u32);
159+
if end <= addr.address {
160+
return Ok((Vec::new(), 0));
161+
}
162+
let clamped_size = end - addr.address;
158163
log::trace!(
159164
"Located jump table @ {:#010X} with entry count {} (from {:#010X})",
160165
addr,
161-
size / 4,
166+
clamped_size / 4,
162167
from
163168
);
164-
let mut entries = Vec::with_capacity(size as usize / 4);
165-
let mut data = section.data_range(addr.address, addr.address + size)?;
169+
let mut entries = Vec::with_capacity(clamped_size as usize / 4);
170+
let mut data = section.data_range(addr.address, end)?;
166171
let mut cur_addr = addr;
167172
loop {
168173
if data.is_empty() {
@@ -192,7 +197,7 @@ fn get_jump_table_entries(
192197
data = &data[4..];
193198
cur_addr += 4;
194199
}
195-
Ok((entries, size))
200+
Ok((entries, clamped_size))
196201
} else {
197202
let mut entries = Vec::new();
198203
let mut cur_addr = addr;

0 commit comments

Comments
 (0)