77
88use super :: read_mp4;
99use super :: Error ;
10+ use super :: ParseStrictness ;
1011use fallible_collections:: TryRead as _;
1112
1213use std:: convert:: TryInto as _;
@@ -470,7 +471,7 @@ fn read_hdlr() {
470471 let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
471472 assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
472473 assert_eq ! ( stream. head. size, 45 ) ;
473- let parsed = super :: read_hdlr ( & mut stream) . unwrap ( ) ;
474+ let parsed = super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) . unwrap ( ) ;
474475 assert_eq ! ( parsed. handler_type, b"vide" ) ;
475476}
476477
@@ -483,10 +484,72 @@ fn read_hdlr_short_name() {
483484 let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
484485 assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
485486 assert_eq ! ( stream. head. size, 33 ) ;
486- let parsed = super :: read_hdlr ( & mut stream) . unwrap ( ) ;
487+ let parsed = super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) . unwrap ( ) ;
487488 assert_eq ! ( parsed. handler_type, b"vide" ) ;
488489}
489490
491+ #[ test]
492+ fn read_hdlr_unsupported_version ( ) {
493+ let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 1 , |s| {
494+ s. B32 ( 0 ) . append_bytes ( b"vide" ) . B32 ( 0 ) . B32 ( 0 ) . B32 ( 0 )
495+ } ) ;
496+ let mut iter = super :: BoxIter :: new ( & mut stream) ;
497+ let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
498+ assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
499+ assert_eq ! ( stream. head. size, 32 ) ;
500+ match super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) {
501+ Err ( Error :: Unsupported ( msg) ) => assert_eq ! ( "hdlr version" , msg) ,
502+ result => {
503+ eprintln ! ( "{:?}" , result) ;
504+ panic ! ( "expected Error::Unsupported" )
505+ }
506+ }
507+ }
508+
509+ #[ test]
510+ fn read_hdlr_invalid_pre_defined_field ( ) {
511+ let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 0 , |s| {
512+ s. B32 ( 1 ) . append_bytes ( b"vide" ) . B32 ( 0 ) . B32 ( 0 ) . B32 ( 0 )
513+ } ) ;
514+ let mut iter = super :: BoxIter :: new ( & mut stream) ;
515+ let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
516+ assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
517+ assert_eq ! ( stream. head. size, 32 ) ;
518+ match super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) {
519+ Err ( Error :: InvalidData ( msg) ) => assert_eq ! (
520+ "The HandlerBox 'pre_defined' field shall be 0 \
521+ per ISOBMFF (ISO 14496-12:2020) § 8.4.3.2",
522+ msg
523+ ) ,
524+ result => {
525+ eprintln ! ( "{:?}" , result) ;
526+ panic ! ( "expected Error::InvalidData" )
527+ }
528+ }
529+ }
530+
531+ #[ test]
532+ fn read_hdlr_invalid_reserved_field ( ) {
533+ let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 0 , |s| {
534+ s. B32 ( 0 ) . append_bytes ( b"vide" ) . B32 ( 0 ) . B32 ( 1 ) . B32 ( 0 )
535+ } ) ;
536+ let mut iter = super :: BoxIter :: new ( & mut stream) ;
537+ let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
538+ assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
539+ assert_eq ! ( stream. head. size, 32 ) ;
540+ match super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) {
541+ Err ( Error :: InvalidData ( msg) ) => assert_eq ! (
542+ "The HandlerBox 'reserved' fields shall be 0 \
543+ per ISOBMFF (ISO 14496-12:2020) § 8.4.3.2",
544+ msg
545+ ) ,
546+ result => {
547+ eprintln ! ( "{:?}" , result) ;
548+ panic ! ( "expected Error::InvalidData" )
549+ }
550+ }
551+ }
552+
490553#[ test]
491554fn read_hdlr_zero_length_name ( ) {
492555 let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 0 , |s| {
@@ -496,7 +559,29 @@ fn read_hdlr_zero_length_name() {
496559 let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
497560 assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
498561 assert_eq ! ( stream. head. size, 32 ) ;
499- let parsed = super :: read_hdlr ( & mut stream) . unwrap ( ) ;
562+ match super :: read_hdlr ( & mut stream, ParseStrictness :: Normal ) {
563+ Err ( Error :: InvalidData ( msg) ) => assert_eq ! (
564+ "The HandlerBox 'name' field shall be null-terminated \
565+ per ISOBMFF (ISO 14496-12:2020) § 8.4.3.2",
566+ msg
567+ ) ,
568+ result => {
569+ eprintln ! ( "{:?}" , result) ;
570+ panic ! ( "expected Error::InvalidData" )
571+ }
572+ }
573+ }
574+
575+ #[ test]
576+ fn read_hdlr_zero_length_name_permissive ( ) {
577+ let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 0 , |s| {
578+ s. B32 ( 0 ) . append_bytes ( b"vide" ) . B32 ( 0 ) . B32 ( 0 ) . B32 ( 0 )
579+ } ) ;
580+ let mut iter = super :: BoxIter :: new ( & mut stream) ;
581+ let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
582+ assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
583+ assert_eq ! ( stream. head. size, 32 ) ;
584+ let parsed = super :: read_hdlr ( & mut stream, ParseStrictness :: Permissive ) . unwrap ( ) ;
500585 assert_eq ! ( parsed. handler_type, b"vide" ) ;
501586}
502587
0 commit comments