@@ -587,6 +587,167 @@ fn max_mixed_config_test() {
587587 ) ;
588588}
589589
590+ #[ test]
591+ fn max_vec_len ( ) {
592+ let config = VerifierConfig {
593+ max_constant_vector_len : 0xFFFF - 1 ,
594+ ..Default :: default ( )
595+ } ;
596+ let double_vec = |item : Vec < u8 > | -> Vec < u8 > {
597+ let mut items = vec ! [ 2 ] ;
598+ items. extend ( item. clone ( ) ) ;
599+ items. extend ( item) ;
600+ items
601+ } ;
602+ let large_vec = |item : Vec < u8 > | -> Vec < u8 > {
603+ let mut items = vec ! [ 0xFF , 0xFF , 3 ] ;
604+ ( 0 ..0xFFFF ) . for_each ( |_| items. extend ( item. clone ( ) ) ) ;
605+ items
606+ } ;
607+ fn tvec ( s : SignatureToken ) -> SignatureToken {
608+ SignatureToken :: Vector ( Box :: new ( s) )
609+ }
610+
611+ let mut module = empty_module ( ) ;
612+ module. constant_pool = vec ! [ Constant {
613+ type_: tvec( SignatureToken :: Bool ) ,
614+ data: large_vec( vec![ 0 ] ) ,
615+ } ] ;
616+ let res = LimitsVerifier :: verify_module ( & config, & module) ;
617+ assert_eq ! (
618+ res. unwrap_err( ) . major_status( ) ,
619+ StatusCode :: TOO_MANY_VECTOR_ELEMENTS ,
620+ ) ;
621+
622+ let mut module = empty_module ( ) ;
623+ module. constant_pool = vec ! [ Constant {
624+ type_: tvec( SignatureToken :: U256 ) ,
625+ data: large_vec( vec![
626+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
627+ 0 , 0 , 0 ,
628+ ] ) ,
629+ } ] ;
630+ let res = LimitsVerifier :: verify_module ( & config, & module) ;
631+ assert_eq ! (
632+ res. unwrap_err( ) . major_status( ) ,
633+ StatusCode :: TOO_MANY_VECTOR_ELEMENTS ,
634+ ) ;
635+
636+ let config = VerifierConfig {
637+ max_constant_vector_len : 0xFFFF ,
638+ ..Default :: default ( )
639+ } ;
640+
641+ let mut module = empty_module ( ) ;
642+ module. constant_pool = vec ! [
643+ // empty
644+ Constant {
645+ type_: tvec( SignatureToken :: Bool ) ,
646+ data: vec![ 0 ] ,
647+ } ,
648+ Constant {
649+ type_: tvec( tvec( SignatureToken :: Bool ) ) ,
650+ data: vec![ 0 ] ,
651+ } ,
652+ Constant {
653+ type_: tvec( tvec( tvec( tvec( SignatureToken :: Bool ) ) ) ) ,
654+ data: vec![ 0 ] ,
655+ } ,
656+ Constant {
657+ type_: tvec( tvec( tvec( tvec( SignatureToken :: Bool ) ) ) ) ,
658+ data: double_vec( vec![ 0 ] ) ,
659+ } ,
660+ // small
661+ Constant {
662+ type_: tvec( SignatureToken :: Bool ) ,
663+ data: vec![ 9 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
664+ } ,
665+ Constant {
666+ type_: tvec( SignatureToken :: U8 ) ,
667+ data: vec![ 9 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] ,
668+ } ,
669+ // large
670+ Constant {
671+ type_: tvec( SignatureToken :: Bool ) ,
672+ data: large_vec( vec![ 0 ] ) ,
673+ } ,
674+ Constant {
675+ type_: tvec( SignatureToken :: U8 ) ,
676+ data: large_vec( vec![ 0 ] ) ,
677+ } ,
678+ Constant {
679+ type_: tvec( SignatureToken :: U16 ) ,
680+ data: large_vec( vec![ 0 , 0 ] ) ,
681+ } ,
682+ Constant {
683+ type_: tvec( SignatureToken :: U32 ) ,
684+ data: large_vec( vec![ 0 , 0 , 0 , 0 ] ) ,
685+ } ,
686+ Constant {
687+ type_: tvec( SignatureToken :: U64 ) ,
688+ data: large_vec( vec![ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) ,
689+ } ,
690+ Constant {
691+ type_: tvec( SignatureToken :: U128 ) ,
692+ data: large_vec( vec![ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) ,
693+ } ,
694+ Constant {
695+ type_: tvec( SignatureToken :: U256 ) ,
696+ data: large_vec( vec![
697+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
698+ 0 , 0 , 0 , 0 ,
699+ ] ) ,
700+ } ,
701+ Constant {
702+ type_: tvec( SignatureToken :: Address ) ,
703+ data: large_vec( vec![ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) ,
704+ } ,
705+ // double large
706+ Constant {
707+ type_: tvec( tvec( SignatureToken :: Bool ) ) ,
708+ data: double_vec( large_vec( vec![ 0 ] ) ) ,
709+ } ,
710+ Constant {
711+ type_: tvec( tvec( SignatureToken :: U8 ) ) ,
712+ data: double_vec( large_vec( vec![ 0 ] ) ) ,
713+ } ,
714+ Constant {
715+ type_: tvec( tvec( SignatureToken :: U16 ) ) ,
716+ data: double_vec( large_vec( vec![ 0 , 0 ] ) ) ,
717+ } ,
718+ Constant {
719+ type_: tvec( tvec( SignatureToken :: U32 ) ) ,
720+ data: double_vec( large_vec( vec![ 0 , 0 , 0 , 0 ] ) ) ,
721+ } ,
722+ Constant {
723+ type_: tvec( tvec( SignatureToken :: U64 ) ) ,
724+ data: double_vec( large_vec( vec![ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ) ) ,
725+ } ,
726+ Constant {
727+ type_: tvec( tvec( SignatureToken :: U128 ) ) ,
728+ data: double_vec( large_vec( vec![
729+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
730+ ] ) ) ,
731+ } ,
732+ Constant {
733+ type_: tvec( tvec( SignatureToken :: U256 ) ) ,
734+ data: double_vec( large_vec( vec![
735+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
736+ 0 , 0 , 0 , 0 ,
737+ ] ) ) ,
738+ } ,
739+ Constant {
740+ type_: tvec( tvec( SignatureToken :: Address ) ) ,
741+ data: double_vec( large_vec( vec![
742+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
743+ ] ) ) ,
744+ } ,
745+ ] ;
746+ let res = LimitsVerifier :: verify_module ( & config, & module) ;
747+
748+ assert ! ( res. is_ok( ) ) ;
749+ }
750+
590751fn multi_struct ( module : & mut CompiledModule , count : usize ) {
591752 for i in 0 ..count {
592753 module
0 commit comments