diff --git a/evm/src/cpu/kernel/interpreter.rs b/evm/src/cpu/kernel/interpreter.rs index fec42351..d332a830 100644 --- a/evm/src/cpu/kernel/interpreter.rs +++ b/evm/src/cpu/kernel/interpreter.rs @@ -426,22 +426,20 @@ impl<'a> Interpreter<'a> { fn run_mload_general(&mut self) { let context = self.pop().as_usize(); - let segment = self.pop().as_usize(); + let segment = Segment::all()[self.pop().as_usize()]; let offset = self.pop().as_usize(); - let value = self - .memory - .mload_general(context, Segment::all()[segment], offset); + let value = self.memory.mload_general(context, segment, offset); + assert!(value < U256::one() << segment.bit_range()); self.push(value); } fn run_mstore_general(&mut self) { - // stack: context, segment, offset, value let context = self.pop().as_usize(); - let segment = self.pop().as_usize(); + let segment = Segment::all()[self.pop().as_usize()]; let offset = self.pop().as_usize(); let value = self.pop(); - self.memory - .mstore_general(context, Segment::all()[segment], offset, value); + assert!(value < U256::one() << segment.bit_range()); + self.memory.mstore_general(context, segment, offset, value); } } diff --git a/evm/src/memory/segments.rs b/evm/src/memory/segments.rs index ad092d41..106f2963 100644 --- a/evm/src/memory/segments.rs +++ b/evm/src/memory/segments.rs @@ -55,5 +55,18 @@ impl Segment { } } - pub(crate) + #[allow(dead_code)] + pub(crate) fn bit_range(&self) -> usize { + match self { + Segment::Code => 8, + Segment::Stack => 256, + Segment::MainMemory => 8, + Segment::Calldata => 8, + Segment::Returndata => 8, + Segment::Metadata => 8, + Segment::KernelGeneral => 8, + Segment::TxnData => 8, + Segment::RlpRaw => 8, + } + } }