@@ -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