7
7
8
8
use super :: read_mp4;
9
9
use super :: Error ;
10
+ use super :: ParseStrictness ;
10
11
use fallible_collections:: TryRead as _;
11
12
12
13
use std:: convert:: TryInto as _;
@@ -470,7 +471,7 @@ fn read_hdlr() {
470
471
let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
471
472
assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
472
473
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 ( ) ;
474
475
assert_eq ! ( parsed. handler_type, b"vide" ) ;
475
476
}
476
477
@@ -483,10 +484,72 @@ fn read_hdlr_short_name() {
483
484
let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
484
485
assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
485
486
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 ( ) ;
487
488
assert_eq ! ( parsed. handler_type, b"vide" ) ;
488
489
}
489
490
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
+
490
553
#[ test]
491
554
fn read_hdlr_zero_length_name ( ) {
492
555
let mut stream = make_fullbox ( BoxSize :: Short ( 32 ) , b"hdlr" , 0 , |s| {
@@ -496,7 +559,29 @@ fn read_hdlr_zero_length_name() {
496
559
let mut stream = iter. next_box ( ) . unwrap ( ) . unwrap ( ) ;
497
560
assert_eq ! ( stream. head. name, BoxType :: HandlerBox ) ;
498
561
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 ( ) ;
500
585
assert_eq ! ( parsed. handler_type, b"vide" ) ;
501
586
}
502
587
0 commit comments