mirror of
https://github.com/status-im/nimbus-eth1.git
synced 2025-01-27 12:35:00 +00:00
consistent evm depth call check
This commit is contained in:
parent
009aa35dfb
commit
89d1834d52
@ -144,11 +144,6 @@ proc postExecuteVM(c: Computation, opCode: static[Op]) {.gcsafe.} =
|
|||||||
proc executeOpcodes*(c: Computation) {.gcsafe.}
|
proc executeOpcodes*(c: Computation) {.gcsafe.}
|
||||||
|
|
||||||
proc applyMessage*(c: Computation, opCode: static[Op]) =
|
proc applyMessage*(c: Computation, opCode: static[Op]) =
|
||||||
if c.msg.depth > MaxCallDepth:
|
|
||||||
c.setError(&"Stack depth limit reached depth={c.msg.depth}")
|
|
||||||
c.nextProc()
|
|
||||||
return
|
|
||||||
|
|
||||||
c.snapshot()
|
c.snapshot()
|
||||||
defer:
|
defer:
|
||||||
c.dispose()
|
c.dispose()
|
||||||
|
@ -528,10 +528,7 @@ proc canTransfer(c: Computation, memPos, memLen: int, value: Uint256, opCode: st
|
|||||||
debug "Computation Failure", reason = "Insufficient funds available to transfer", required = c.msg.value, balance = senderBalance
|
debug "Computation Failure", reason = "Insufficient funds available to transfer", required = c.msg.value, balance = senderBalance
|
||||||
return false
|
return false
|
||||||
|
|
||||||
# unlike the other MaxCallDepth comparison,
|
if c.msg.depth >= MaxCallDepth:
|
||||||
# this one has not been entered child computation
|
|
||||||
# thats why it has `+ 1`
|
|
||||||
if c.msg.depth + 1 > MaxCallDepth:
|
|
||||||
debug "Computation Failure", reason = "Stack too deep", maximumDepth = MaxCallDepth, depth = c.msg.depth
|
debug "Computation Failure", reason = "Stack too deep", maximumDepth = MaxCallDepth, depth = c.msg.depth
|
||||||
return false
|
return false
|
||||||
|
|
||||||
@ -732,6 +729,12 @@ template genCall(callName: untyped, opCode: Op): untyped =
|
|||||||
if childGasFee >= 0:
|
if childGasFee >= 0:
|
||||||
c.gasMeter.consumeGas(childGasFee, reason = $opCode)
|
c.gasMeter.consumeGas(childGasFee, reason = $opCode)
|
||||||
|
|
||||||
|
if c.msg.depth >= MaxCallDepth:
|
||||||
|
debug "Computation Failure", reason = "Stack too deep", maximumDepth = MaxCallDepth, depth = c.msg.depth
|
||||||
|
# return unused gas
|
||||||
|
c.gasMeter.returnGas(childGasLimit)
|
||||||
|
return
|
||||||
|
|
||||||
if childGasFee < 0 and childGasLimit <= 0:
|
if childGasFee < 0 and childGasLimit <= 0:
|
||||||
raise newException(OutOfGas, "Gas not enough to perform calculation (" & callNameStr & ")")
|
raise newException(OutOfGas, "Gas not enough to perform calculation (" & callNameStr & ")")
|
||||||
|
|
||||||
@ -767,8 +770,16 @@ template genCall(callName: untyped, opCode: Op): untyped =
|
|||||||
## CALLCODE, 0xf2, Message-call into this account with an alternative account's code.
|
## CALLCODE, 0xf2, Message-call into this account with an alternative account's code.
|
||||||
## DELEGATECALL, 0xf4, Message-call into this account with an alternative account's code, but persisting the current values for sender and value.
|
## DELEGATECALL, 0xf4, Message-call into this account with an alternative account's code, but persisting the current values for sender and value.
|
||||||
## STATICCALL, 0xfa, Static message-call into an account.
|
## STATICCALL, 0xfa, Static message-call into an account.
|
||||||
|
when opCode == Call:
|
||||||
|
if emvcStatic == c.msg.flags and c.stack[^3, Uint256] > 0.u256:
|
||||||
|
raise newException(StaticContextError, "Cannot modify state while inside of a STATICCALL context")
|
||||||
|
|
||||||
var child = `callName Setup`(c, callName.astToStr)
|
var child = `callName Setup`(c, callName.astToStr)
|
||||||
|
|
||||||
|
if child.isNil:
|
||||||
|
push: 0
|
||||||
|
return
|
||||||
|
|
||||||
continuation(child):
|
continuation(child):
|
||||||
addChildComputation(c, child)
|
addChildComputation(c, child)
|
||||||
|
|
||||||
@ -783,10 +794,6 @@ template genCall(callName: untyped, opCode: Op): untyped =
|
|||||||
c.memOutPos,
|
c.memOutPos,
|
||||||
child.output.toOpenArray(0, actualOutputSize - 1))
|
child.output.toOpenArray(0, actualOutputSize - 1))
|
||||||
|
|
||||||
when opCode == Call:
|
|
||||||
if emvcStatic == c.msg.flags and child.msg.value > 0.u256:
|
|
||||||
raise newException(StaticContextError, "Cannot modify state while inside of a STATICCALL context")
|
|
||||||
|
|
||||||
child.applyMessage(opCode)
|
child.applyMessage(opCode)
|
||||||
|
|
||||||
genCall(call, Call)
|
genCall(call, Call)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user