From 0941ec3a926564d82f7e201d5aa7582937126db2 Mon Sep 17 00:00:00 2001 From: Ivan Litteri <67517699+ilitteri@users.noreply.github.com> Date: Thu, 28 Nov 2024 14:19:32 -0300 Subject: [PATCH] fix(levm): `log`x non-compliance memory allocation (#1330) Resolves #1323 --- crates/vm/levm/src/memory.rs | 4 ++++ crates/vm/levm/tests/edge_case_tests.rs | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/crates/vm/levm/src/memory.rs b/crates/vm/levm/src/memory.rs index 995990ca82..0baf3ba216 100644 --- a/crates/vm/levm/src/memory.rs +++ b/crates/vm/levm/src/memory.rs @@ -66,6 +66,10 @@ impl Memory { } pub fn load_range(&mut self, offset: usize, size: usize) -> Result, VMError> { + if size == 0 { + return Ok(Vec::new()); + } + let size_to_load = offset.checked_add(size).ok_or(VMError::Internal( InternalError::ArithmeticOperationOverflow, ))?; diff --git a/crates/vm/levm/tests/edge_case_tests.rs b/crates/vm/levm/tests/edge_case_tests.rs index 50a5bdade6..57198efc18 100644 --- a/crates/vm/levm/tests/edge_case_tests.rs +++ b/crates/vm/levm/tests/edge_case_tests.rs @@ -251,3 +251,14 @@ fn test_non_compliance_extcodecopy_size_and_destoffset() { &U256::from(64) ); } + +#[test] +fn test_non_compliance_log() { + let mut vm = new_vm_with_bytecode(Bytes::copy_from_slice(&[95, 97, 89, 0, 160, 89])).unwrap(); + let mut current_call_frame = vm.call_frames.pop().unwrap(); + vm.execute(&mut current_call_frame); + assert_eq!( + current_call_frame.stack.stack.first().unwrap(), + &U256::zero() + ); +}