@@ -712,7 +712,7 @@ impl VM {
712
712
let b = self . stack . pop ( ) ?;
713
713
714
714
// convert a to usize
715
- let usize_a: usize = a. value . try_into ( ) ? ;
715
+ let usize_a: usize = a. value . try_into ( ) . unwrap_or ( usize :: MAX ) ;
716
716
717
717
let mut result = I256 :: ZERO ;
718
718
if !b. value . is_zero ( ) {
@@ -737,8 +737,8 @@ impl VM {
737
737
let size = self . stack . pop ( ) ?. value ;
738
738
739
739
// Safely convert U256 to usize
740
- let offset: usize = offset. try_into ( ) ? ;
741
- let size: usize = size. try_into ( ) ? ;
740
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
741
+ let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
742
742
743
743
let data = self . memory . read ( offset, size) ;
744
744
let result = keccak256 ( data) ;
@@ -802,9 +802,9 @@ impl VM {
802
802
let i = self . stack . pop ( ) ?. value ;
803
803
804
804
// Safely convert U256 to usize
805
- let i: usize = i. try_into ( ) ? ;
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 ( ) ? ;
936
- let size: usize = size. try_into ( ) ? ;
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 ( ) ? ;
975
- let size: usize = size. try_into ( ) ? ;
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 ) ;
@@ -1033,7 +1034,7 @@ impl VM {
1033
1034
// MLOAD
1034
1035
0x51 => {
1035
1036
let i = self . stack . pop ( ) ?. value ;
1036
- let i: usize = i. try_into ( ) ? ;
1037
+ let i: usize = i. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1037
1038
1038
1039
let result = U256 :: from_be_slice ( self . memory . read ( i, 32 ) . as_slice ( ) ) ;
1039
1040
@@ -1050,7 +1051,7 @@ impl VM {
1050
1051
let value = self . stack . pop ( ) ?. value ;
1051
1052
1052
1053
// Safely convert U256 to usize
1053
- let offset: usize = offset. try_into ( ) ? ;
1054
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1054
1055
1055
1056
// consume dynamic gas
1056
1057
let gas_cost = self . memory . expansion_cost ( offset, 32 ) ;
@@ -1071,7 +1072,7 @@ impl VM {
1071
1072
let value = self . stack . pop ( ) ?. value ;
1072
1073
1073
1074
// Safely convert U256 to usize
1074
- let offset: usize = offset. try_into ( ) ? ;
1075
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1075
1076
1076
1077
// consume dynamic gas
1077
1078
let gas_cost = self . memory . expansion_cost ( offset, 1 ) ;
@@ -1289,8 +1290,8 @@ impl VM {
1289
1290
self . stack . pop_n ( topic_count as usize ) . iter ( ) . map ( |x| x. value ) . collect ( ) ;
1290
1291
1291
1292
// Safely convert U256 to usize
1292
- let offset: usize = offset. try_into ( ) ? ;
1293
- let size: usize = size. try_into ( ) ? ;
1293
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1294
+ let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1294
1295
1295
1296
let data = self . memory . read ( offset, size) ;
1296
1297
@@ -1341,8 +1342,8 @@ impl VM {
1341
1342
let size = self . stack . pop ( ) ?. value ;
1342
1343
1343
1344
// Safely convert U256 to usize
1344
- let offset: usize = offset. try_into ( ) ? ;
1345
- let size: usize = size. try_into ( ) ? ;
1345
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1346
+ let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1346
1347
1347
1348
// consume dynamic gas
1348
1349
let gas_cost = self . memory . expansion_cost ( offset, size) ;
@@ -1380,8 +1381,8 @@ impl VM {
1380
1381
let size = self . stack . pop ( ) ?. value ;
1381
1382
1382
1383
// Safely convert U256 to usize
1383
- let offset: usize = offset. try_into ( ) ? ;
1384
- let size: usize = size. try_into ( ) ? ;
1384
+ let offset: usize = offset. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1385
+ let size: usize = size. try_into ( ) . unwrap_or ( usize :: MAX ) ;
1385
1386
1386
1387
self . exit ( 1 , self . memory . read ( offset, size) ) ;
1387
1388
}
0 commit comments