diff --git a/src/compiler/evm_frontend/evm_mir_compiler.cpp b/src/compiler/evm_frontend/evm_mir_compiler.cpp index 660b8b87..1b4083c9 100644 --- a/src/compiler/evm_frontend/evm_mir_compiler.cpp +++ b/src/compiler/evm_frontend/evm_mir_compiler.cpp @@ -4552,6 +4552,10 @@ typename EVMMirBuilder::Operand EVMMirBuilder::handleCodeSize() { void EVMMirBuilder::handleCodeCopy(Operand DestOffsetComponents, Operand OffsetComponents, Operand SizeComponents) { + if (SizeComponents.isConstU64() && SizeComponents.getConstValue()[0] == 0) { + return; + } + const auto &RuntimeFunctions = getRuntimeFunctionTable(); normalizeOffsetWithSize(DestOffsetComponents, SizeComponents); uint64_t Non64Value = std::numeric_limits::max(); @@ -6715,6 +6719,10 @@ MInstruction *EVMMirBuilder::getCurrentInstancePointer() { void EVMMirBuilder::handleCallDataCopy(Operand DestOffsetComponents, Operand OffsetComponents, Operand SizeComponents) { + if (SizeComponents.isConstU64() && SizeComponents.getConstValue()[0] == 0) { + return; + } + const auto &RuntimeFunctions = getRuntimeFunctionTable(); uint64_t Non64Value = std::numeric_limits::max(); normalizeOperandU64(DestOffsetComponents, &Non64Value); diff --git a/tests/evm_asm/calldatacopy_zero_size.easm b/tests/evm_asm/calldatacopy_zero_size.easm new file mode 100644 index 00000000..4628d5dd --- /dev/null +++ b/tests/evm_asm/calldatacopy_zero_size.easm @@ -0,0 +1,11 @@ +// CALLDATACOPY with size 0 must not access or expand memory +PUSH1 0x2a +PUSH1 0x00 +MSTORE +PUSH1 0x00 +PUSH32 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +PUSH1 0x00 +CALLDATACOPY +PUSH1 0x20 +PUSH1 0x00 +RETURN diff --git a/tests/evm_asm/calldatacopy_zero_size.evm.hex b/tests/evm_asm/calldatacopy_zero_size.evm.hex new file mode 100644 index 00000000..b85fb582 --- /dev/null +++ b/tests/evm_asm/calldatacopy_zero_size.evm.hex @@ -0,0 +1 @@ +602A60005260007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60003760206000F3 diff --git a/tests/evm_asm/calldatacopy_zero_size.expected b/tests/evm_asm/calldatacopy_zero_size.expected new file mode 100644 index 00000000..d7ed191d --- /dev/null +++ b/tests/evm_asm/calldatacopy_zero_size.expected @@ -0,0 +1,8 @@ +status: success +error_code: 0 +stack: [] +memory: '000000000000000000000000000000000000000000000000000000000000002A' +storage: {} +transient_storage: {} +return: '000000000000000000000000000000000000000000000000000000000000002A' +events: []