Skip to content

Commit 89a78c3

Browse files
Merge pull request #499 from wcampbell0x2a/fix-more-fuzz-found-panics
Fix more fuzz found panics
2 parents a2a71f5 + c4b0a89 commit 89a78c3

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

backhand-cli/src/bin/unsquashfs.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,14 @@ fn main() -> ExitCode {
208208
return ExitCode::SUCCESS;
209209
}
210210

211-
let squashfs = Squashfs::from_reader_with_offset_and_kind(file, args.offset, kind).unwrap();
211+
let squashfs = match Squashfs::from_reader_with_offset_and_kind(file, args.offset, kind) {
212+
Ok(s) => s,
213+
Err(_e) => {
214+
let line = format!("{:>14}", red_bold.apply_to(format!("Could not read image: {_e}")));
215+
pb.finish_with_message(line);
216+
return ExitCode::FAILURE;
217+
}
218+
};
212219
let root_process = unsafe { geteuid() == 0 };
213220
if root_process {
214221
umask(Mode::from_bits(0).unwrap());

backhand/src/squashfs.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -464,10 +464,16 @@ impl<'b> Squashfs<'b> {
464464
return Ok(None);
465465
}
466466

467-
// ignore blocks before our block_index, grab all the rest of the bytes
468-
// TODO: perf
469-
let offset = self.dir_blocks.0.get(&block_index).unwrap();
470-
let block = &self.dir_blocks.1[*offset as usize..];
467+
let Some(offset) = self.dir_blocks.0.get(&block_index) else {
468+
return Err(BackhandError::CorruptedOrInvalidSquashfs);
469+
};
470+
let Some(block) = &self.dir_blocks.1.get(*offset as usize..) else {
471+
return Err(BackhandError::CorruptedOrInvalidSquashfs);
472+
};
473+
474+
if (block.len() as u32) < (block_offset as u32 + file_size - 3) {
475+
return Err(BackhandError::CorruptedOrInvalidSquashfs);
476+
}
471477

472478
let bytes = &block[block_offset..][..file_size as usize - 3];
473479
let mut dirs = vec![];
@@ -512,9 +518,13 @@ impl<'b> Squashfs<'b> {
512518
for d in &dirs {
513519
trace!("extracting entry: {:#?}", d.dir_entries);
514520
for entry in &d.dir_entries {
515-
let inode_key =
516-
(d.inode_num as i32 + entry.inode_offset as i32).try_into().unwrap();
517-
let found_inode = &self.inodes[&inode_key];
521+
let Ok(inode_key) = (d.inode_num as i32 + entry.inode_offset as i32).try_into()
522+
else {
523+
return Err(BackhandError::CorruptedOrInvalidSquashfs);
524+
};
525+
let Some(found_inode) = &self.inodes.get(&inode_key) else {
526+
return Err(BackhandError::CorruptedOrInvalidSquashfs);
527+
};
518528
let header = found_inode.header;
519529
fullpath.push(entry.name()?);
520530

0 commit comments

Comments
 (0)