From cf80c3754ab03c58c434477dba085f4dfa503499 Mon Sep 17 00:00:00 2001 From: Dragan Milic Date: Tue, 23 Sep 2025 23:35:21 +0200 Subject: [PATCH] eth/tracers/native: guard agains stack underflow in keccak256PreimageTracer --- eth/tracers/native/keccak256_preimage.go | 10 ++++++++-- eth/tracers/native/keccak256_preimage_test.go | 6 ++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/eth/tracers/native/keccak256_preimage.go b/eth/tracers/native/keccak256_preimage.go index ac43ece6ed..57da0ceeda 100644 --- a/eth/tracers/native/keccak256_preimage.go +++ b/eth/tracers/native/keccak256_preimage.go @@ -55,8 +55,14 @@ func newKeccak256preimageTracer(ctx *tracers.Context, cfg json.RawMessage, chain func (t *keccak256preimageTracer) OnOpcode(pc uint64, op byte, gas, cost uint64, scope tracing.OpContext, rData []byte, depth int, err error) { if op == byte(vm.KECCAK256) { - dataOffset := peepStack(scope.StackData(), 0).Uint64() - dataLength := peepStack(scope.StackData(), 1).Uint64() + sd := scope.StackData() + // it turns out that sometimes the stack is empty, evm will fail in this case, but we should not panic here + if len(sd) < 2 { + return + } + + dataOffset := peepStack(sd, 0).Uint64() + dataLength := peepStack(sd, 1).Uint64() preimage, err := internal.GetMemoryCopyPadded(scope.MemoryData(), int64(dataOffset), int64(dataLength)) if err != nil { log.Warn("erc7562Tracer: failed to copy keccak preimage from memory", "err", err) diff --git a/eth/tracers/native/keccak256_preimage_test.go b/eth/tracers/native/keccak256_preimage_test.go index bda571dcf9..b54b0cc238 100644 --- a/eth/tracers/native/keccak256_preimage_test.go +++ b/eth/tracers/native/keccak256_preimage_test.go @@ -397,10 +397,8 @@ func TestKeccak256PreimageTracerInsufficientStack(t *testing.T) { stack: stack, } - // This should panic due to insufficient stack, but we're testing it doesn't crash the test - require.Panics(t, func() { - tracer.OnOpcode(0, byte(vm.KECCAK256), 0, 0, mockScope, nil, 0, nil) - }) + // This should not panic due to insufficient stack + tracer.OnOpcode(0, byte(vm.KECCAK256), 0, 0, mockScope, nil, 0, nil) } func TestKeccak256PreimageTracerLargeData(t *testing.T) {