From f578d41ee6b3087f8021fd561a0b5665aea3dba6 Mon Sep 17 00:00:00 2001
From: Martin Holst Swende <martin@swende.se>
Date: Mon, 24 Jun 2019 10:54:06 +0200
Subject: [PATCH] core/vm, internal/ethapi: fail on eth_call when it times out,
 fixes #19186 (#19737)

---
 core/vm/evm.go         | 5 +++++
 internal/ethapi/api.go | 4 ++++
 2 files changed, 9 insertions(+)

diff --git a/core/vm/evm.go b/core/vm/evm.go
index 70e1cd1b8..d47b00938 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -169,6 +169,11 @@ func (evm *EVM) Cancel() {
 	atomic.StoreInt32(&evm.abort, 1)
 }
 
+// Cancelled returns true if Cancel has been called
+func (evm *EVM) Cancelled() bool {
+	return atomic.LoadInt32(&evm.abort) == 1
+}
+
 // Interpreter returns the current interpreter
 func (evm *EVM) Interpreter() Interpreter {
 	return evm.interpreter
diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go
index 4132ff144..338223fd5 100644
--- a/internal/ethapi/api.go
+++ b/internal/ethapi/api.go
@@ -802,6 +802,10 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNr rpc.BlockNumb
 	if err := vmError(); err != nil {
 		return nil, 0, false, err
 	}
+	// If the timer caused an abort, return an appropriate error message
+	if evm.Cancelled() {
+		return nil, 0, false, fmt.Errorf("execution aborted (timeout = %v)", timeout)
+	}
 	return res, gas, failed, err
 }
 
-- 
GitLab