@@ -2273,11 +2273,11 @@ impl<'a, T: Read> BoxIter<'a, T> {
22732273 fn next_box ( & mut self ) -> Result < Option < BMFFBox < T > > > {
22742274 let r = read_box_header ( self . src ) ;
22752275 match r {
2276- Ok ( h ) => Ok ( Some ( BMFFBox {
2276+ Ok ( Some ( h ) ) => Ok ( Some ( BMFFBox {
22772277 head : h,
22782278 content : self . src . take ( h. size . saturating_sub ( h. offset ) ) ,
22792279 } ) ) ,
2280- Err ( Error :: UnexpectedEOF ) => Ok ( None ) ,
2280+ Ok ( None ) => Ok ( None ) ,
22812281 Err ( e) => Err ( e) ,
22822282 }
22832283 }
@@ -2332,8 +2332,12 @@ impl<'a, T> Drop for BMFFBox<'a, T> {
23322332/// skip unknown or uninteresting boxes.
23332333///
23342334/// See ISOBMFF (ISO 14496-12:2020) § 4.2
2335- fn read_box_header < T : ReadBytesExt > ( src : & mut T ) -> Result < BoxHeader > {
2336- let size32 = be_u32 ( src) ?;
2335+ fn read_box_header < T : ReadBytesExt > ( src : & mut T ) -> Result < Option < BoxHeader > > {
2336+ let size32 = match be_u32 ( src) {
2337+ Ok ( v) => v,
2338+ Err ( Error :: UnexpectedEOF ) => return Ok ( None ) ,
2339+ Err ( error) => return Err ( error) ,
2340+ } ;
23372341 let name = BoxType :: from ( be_u32 ( src) ?) ;
23382342 let size = match size32 {
23392343 // valid only for top-level box and indicates it's the last box in the file. usually mdat.
@@ -2382,12 +2386,12 @@ fn read_box_header<T: ReadBytesExt>(src: &mut T) -> Result<BoxHeader> {
23822386 None
23832387 } ;
23842388 assert ! ( offset <= size || size == 0 ) ;
2385- Ok ( BoxHeader {
2389+ Ok ( Some ( BoxHeader {
23862390 name,
23872391 size,
23882392 offset,
23892393 uuid,
2390- } )
2394+ } ) )
23912395}
23922396
23932397/// Parse the extra header fields for a full box.
@@ -2521,7 +2525,19 @@ pub fn read_avif<T: Read>(f: &mut T, strictness: ParseStrictness) -> Result<Avif
25212525 let mut image_sequence = None ;
25222526 let mut media_storage = TryVec :: new ( ) ;
25232527
2524- while let Some ( mut b) = iter. next_box ( ) ? {
2528+ loop {
2529+ let mut b = match iter. next_box ( ) {
2530+ Ok ( Some ( b) ) => b,
2531+ Ok ( _) => break ,
2532+ Err ( Error :: UnexpectedEOF ) => {
2533+ if strictness == ParseStrictness :: Strict {
2534+ return Err ( Error :: UnexpectedEOF ) ;
2535+ }
2536+ break ;
2537+ }
2538+ Err ( error) => return Err ( error) ,
2539+ } ;
2540+
25252541 trace ! ( "read_avif parsing {:?} box" , b. head. name) ;
25262542 match b. head . name {
25272543 BoxType :: MetadataBox => {
@@ -2564,7 +2580,14 @@ pub fn read_avif<T: Read>(f: &mut T, strictness: ParseStrictness) -> Result<Avif
25642580 } ;
25652581 media_storage. push ( DataBox :: from_mdat ( file_offset, data) ) ?;
25662582 }
2567- _ => skip_box_content ( & mut b) ?,
2583+ _ => {
2584+ let result = skip_box_content ( & mut b) ;
2585+ // Allow garbage at EOF if we aren't in strict mode.
2586+ if b. bytes_left ( ) > 0 && strictness != ParseStrictness :: Strict {
2587+ break ;
2588+ }
2589+ result?;
2590+ }
25682591 }
25692592
25702593 check_parser_state ! ( b. content) ;
0 commit comments