File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -434,7 +434,7 @@ impl<'a> Face<'a> {
434434 let i = self . records . binary_search_by ( |record| record. tag . cmp ( & tag) ) . ok ( ) ?;
435435 let record = self . records . get ( i) ?;
436436 let start = record. offset as usize ;
437- let end = start + ( record. length as usize ) ;
437+ let end = start. checked_add ( record. length as usize ) ? ;
438438 self . data . get ( start..end)
439439 }
440440}
@@ -684,4 +684,19 @@ mod tests {
684684
685685 assert_eq ! ( result, Err ( Error :: CFFError ) ) ;
686686 }
687+
688+ #[ test]
689+ fn table_record_with_invalid_bounds_returns_none ( ) {
690+ let face = Face {
691+ data : & [ ] ,
692+ records : vec ! [ TableRecord {
693+ tag: Tag :: HEAD ,
694+ checksum: 0 ,
695+ offset: u32 :: MAX ,
696+ length: u32 :: MAX ,
697+ } ] ,
698+ } ;
699+
700+ assert_eq ! ( face. table( Tag :: HEAD ) , None ) ;
701+ }
687702}
Original file line number Diff line number Diff line change @@ -50,8 +50,9 @@ impl<'a> Reader<'a> {
5050 /// Read a certain number of bytes.
5151 #[ inline]
5252 pub fn read_bytes ( & mut self , len : usize ) -> Option < & ' a [ u8 ] > {
53- let v = self . data . get ( self . offset ..self . offset + len) ?;
54- self . offset += len;
53+ let end = self . offset . checked_add ( len) ?;
54+ let v = self . data . get ( self . offset ..end) ?;
55+ self . offset = end;
5556 Some ( v)
5657 }
5758
You can’t perform that action at this time.
0 commit comments