core/vm, internal/ethapi: fail on eth_call when it times out, fixes #19186 (#19737)

This commit is contained in:
Martin Holst Swende 2019-06-24 10:54:06 +02:00 committed by Péter Szilágyi
parent cdadf57bf9
commit f578d41ee6
2 changed files with 9 additions and 0 deletions

View File

@ -169,6 +169,11 @@ func (evm *EVM) Cancel() {
atomic.StoreInt32(&evm.abort, 1) 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 // Interpreter returns the current interpreter
func (evm *EVM) Interpreter() Interpreter { func (evm *EVM) Interpreter() Interpreter {
return evm.interpreter return evm.interpreter

View File

@ -802,6 +802,10 @@ func DoCall(ctx context.Context, b Backend, args CallArgs, blockNr rpc.BlockNumb
if err := vmError(); err != nil { if err := vmError(); err != nil {
return nil, 0, false, err 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 return res, gas, failed, err
} }