Skip to content

Commit 5d87f63

Browse files
committed
feat: fix Uint<256> conversion issues by clamping values
1 parent 6049181 commit 5d87f63

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

crates/vm/src/core/vm.rs

+17-17
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ impl VM {
712712
let b = self.stack.pop()?;
713713

714714
// 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);
716716

717717
let mut result = I256::ZERO;
718718
if !b.value.is_zero() {
@@ -737,8 +737,8 @@ impl VM {
737737
let size = self.stack.pop()?.value;
738738

739739
// 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);
742742

743743
let data = self.memory.read(offset, size);
744744
let result = keccak256(data);
@@ -802,7 +802,7 @@ impl VM {
802802
let i = self.stack.pop()?.value;
803803

804804
// Safely convert U256 to usize
805-
let i: usize = i.try_into()?;
805+
let i: usize = i.try_into().unwrap_or(usize::MAX);
806806

807807
let result = if i + 32 > self.calldata.len() {
808808
let mut value = [0u8; 32];
@@ -932,8 +932,8 @@ impl VM {
932932
let size = self.stack.pop()?.value;
933933

934934
// Safely convert U256 to usize
935-
let dest_offset: usize = dest_offset.try_into()?;
936-
let size: usize = size.try_into()?;
935+
let dest_offset: usize = dest_offset.try_into().unwrap_or(usize::MAX);
936+
let size: usize = size.try_into().unwrap_or(usize::MAX);
937937

938938
let mut value = Vec::with_capacity(size);
939939
value.fill(0xff);
@@ -971,8 +971,8 @@ impl VM {
971971
let size = self.stack.pop()?.value;
972972

973973
// Safely convert U256 to usize
974-
let dest_offset: usize = dest_offset.try_into()?;
975-
let size: usize = size.try_into()?;
974+
let dest_offset: usize = dest_offset.try_into().unwrap_or(usize::MAX);
975+
let size: usize = size.try_into().unwrap_or(usize::MAX);
976976

977977
let mut value = Vec::with_capacity(size);
978978
value.fill(0xff);
@@ -1033,7 +1033,7 @@ impl VM {
10331033
// MLOAD
10341034
0x51 => {
10351035
let i = self.stack.pop()?.value;
1036-
let i: usize = i.try_into()?;
1036+
let i: usize = i.try_into().unwrap_or(usize::MAX);
10371037

10381038
let result = U256::from_be_slice(self.memory.read(i, 32).as_slice());
10391039

@@ -1050,7 +1050,7 @@ impl VM {
10501050
let value = self.stack.pop()?.value;
10511051

10521052
// Safely convert U256 to usize
1053-
let offset: usize = offset.try_into()?;
1053+
let offset: usize = offset.try_into().unwrap_or(usize::MAX);
10541054

10551055
// consume dynamic gas
10561056
let gas_cost = self.memory.expansion_cost(offset, 32);
@@ -1071,7 +1071,7 @@ impl VM {
10711071
let value = self.stack.pop()?.value;
10721072

10731073
// Safely convert U256 to usize
1074-
let offset: usize = offset.try_into()?;
1074+
let offset: usize = offset.try_into().unwrap_or(usize::MAX);
10751075

10761076
// consume dynamic gas
10771077
let gas_cost = self.memory.expansion_cost(offset, 1);
@@ -1289,8 +1289,8 @@ impl VM {
12891289
self.stack.pop_n(topic_count as usize).iter().map(|x| x.value).collect();
12901290

12911291
// Safely convert U256 to usize
1292-
let offset: usize = offset.try_into()?;
1293-
let size: usize = size.try_into()?;
1292+
let offset: usize = offset.try_into().unwrap_or(usize::MAX);
1293+
let size: usize = size.try_into().unwrap_or(usize::MAX);
12941294

12951295
let data = self.memory.read(offset, size);
12961296

@@ -1341,8 +1341,8 @@ impl VM {
13411341
let size = self.stack.pop()?.value;
13421342

13431343
// Safely convert U256 to usize
1344-
let offset: usize = offset.try_into()?;
1345-
let size: usize = size.try_into()?;
1344+
let offset: usize = offset.try_into().unwrap_or(usize::MAX);
1345+
let size: usize = size.try_into().unwrap_or(usize::MAX);
13461346

13471347
// consume dynamic gas
13481348
let gas_cost = self.memory.expansion_cost(offset, size);
@@ -1380,8 +1380,8 @@ impl VM {
13801380
let size = self.stack.pop()?.value;
13811381

13821382
// Safely convert U256 to usize
1383-
let offset: usize = offset.try_into()?;
1384-
let size: usize = size.try_into()?;
1383+
let offset: usize = offset.try_into().unwrap_or(usize::MAX);
1384+
let size: usize = size.try_into().unwrap_or(usize::MAX);
13851385

13861386
self.exit(1, self.memory.read(offset, size));
13871387
}

0 commit comments

Comments
 (0)