@@ -804,7 +804,7 @@ impl VM {
804
804
// Safely convert U256 to usize
805
805
let i: usize = i. try_into ( ) . unwrap_or ( usize:: MAX ) ;
806
806
807
- let result = if i + 32 > self . calldata . len ( ) {
807
+ let result = if i. saturating_add ( 32 ) > self . calldata . len ( ) {
808
808
let mut value = [ 0u8 ; 32 ] ;
809
809
810
810
if i <= self . calldata . len ( ) {
@@ -881,6 +881,7 @@ impl VM {
881
881
let offset: usize = offset. try_into ( ) . unwrap_or ( usize:: MAX ) ;
882
882
let size: usize = size. try_into ( ) . unwrap_or ( usize:: MAX ) ;
883
883
884
+ // clamp values to bytecode length
884
885
let value_offset_safe = offset. saturating_add ( size) . min ( self . bytecode . len ( ) ) ;
885
886
let mut value =
886
887
self . bytecode . get ( offset..value_offset_safe) . unwrap_or ( & [ ] ) . to_owned ( ) ;
@@ -932,8 +933,8 @@ impl VM {
932
933
let size = self . stack . pop ( ) ?. value ;
933
934
934
935
// Safely convert U256 to usize
935
- let dest_offset: usize = dest_offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
936
- let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
936
+ let dest_offset: usize = dest_offset. try_into ( ) . unwrap_or ( 0 ) ;
937
+ let size: usize = size. try_into ( ) . unwrap_or ( 256 ) ;
937
938
938
939
let mut value = Vec :: with_capacity ( size) ;
939
940
value. fill ( 0xff ) ;
@@ -971,8 +972,8 @@ impl VM {
971
972
let size = self . stack . pop ( ) ?. value ;
972
973
973
974
// Safely convert U256 to usize
974
- let dest_offset: usize = dest_offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
975
- let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
975
+ let dest_offset: usize = dest_offset. try_into ( ) . unwrap_or ( 0 ) ;
976
+ let size: usize = size. try_into ( ) . unwrap_or ( 256 ) ;
976
977
977
978
let mut value = Vec :: with_capacity ( size) ;
978
979
value. fill ( 0xff ) ;
0 commit comments