Add assert to range check memory values

This commit is contained in:
wborgeaud 2022-07-25 10:39:51 +02:00
parent 715c350ee8
commit 304299a007
2 changed files with 20 additions and 9 deletions

View File

@ -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);
}
}

View File

@ -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,
}
}
}