@@ -2275,7 +2275,7 @@ impl<'a, T: Read> BoxIter<'a, T> {
22752275 match r {
22762276 Ok ( h) => Ok ( Some ( BMFFBox {
22772277 head : h,
2278- content : self . src . take ( h. size - h. offset ) ,
2278+ content : self . src . take ( h. size . saturating_sub ( h. offset ) ) ,
22792279 } ) ) ,
22802280 Err ( Error :: UnexpectedEOF ) => Ok ( None ) ,
22812281 Err ( e) => Err ( e) ,
@@ -2337,7 +2337,13 @@ fn read_box_header<T: ReadBytesExt>(src: &mut T) -> Result<BoxHeader> {
23372337 let name = BoxType :: from ( be_u32 ( src) ?) ;
23382338 let size = match size32 {
23392339 // valid only for top-level box and indicates it's the last box in the file. usually mdat.
2340- 0 => return Err ( Error :: Unsupported ( "unknown sized box" ) ) ,
2340+ 0 => {
2341+ if name == BoxType :: MediaDataBox {
2342+ 0
2343+ } else {
2344+ return Err ( Error :: Unsupported ( "unknown sized box" ) ) ;
2345+ }
2346+ }
23412347 1 => {
23422348 let size64 = be_u64 ( src) ?;
23432349 if size64 < BoxHeader :: MIN_LARGE_SIZE {
@@ -2375,7 +2381,7 @@ fn read_box_header<T: ReadBytesExt>(src: &mut T) -> Result<BoxHeader> {
23752381 } else {
23762382 None
23772383 } ;
2378- assert ! ( offset <= size) ;
2384+ assert ! ( offset <= size || size == 0 ) ;
23792385 Ok ( BoxHeader {
23802386 name,
23812387 size,
@@ -2536,7 +2542,26 @@ pub fn read_avif<T: Read>(f: &mut T, strictness: ParseStrictness) -> Result<Avif
25362542 }
25372543 BoxType :: MediaDataBox => {
25382544 let file_offset = b. offset ( ) ;
2539- let data = b. read_into_try_vec ( ) ?;
2545+ let data = if b. head . size == 0 {
2546+ // Unknown sized `mdat`, read in chunks until EOF.
2547+ const BUF_SIZE : usize = 64 * 1024 ;
2548+ let mut data = TryVec :: with_capacity ( BUF_SIZE ) ?;
2549+ loop {
2550+ let got = fallible_collections:: try_read_up_to (
2551+ b. content . get_mut ( ) ,
2552+ BUF_SIZE as u64 ,
2553+ & mut data,
2554+ ) ?;
2555+ if got == 0 {
2556+ // Mark `content` as consumed.
2557+ b. content . set_limit ( 0 ) ;
2558+ break ;
2559+ }
2560+ }
2561+ data
2562+ } else {
2563+ b. read_into_try_vec ( ) ?
2564+ } ;
25402565 media_storage. push ( DataBox :: from_mdat ( file_offset, data) ) ?;
25412566 }
25422567 _ => skip_box_content ( & mut b) ?,
0 commit comments