From 9528774d97c40e0f09dca83ed4c70854d6cdd1ab Mon Sep 17 00:00:00 2001 From: Benjamin Bollen <ben@erisindustries.com> Date: Tue, 6 Sep 2016 15:55:10 +0200 Subject: [PATCH] vm: for DELEGATECALL value is not stored on stack as preserved --- .../src/github.com/tendermint/tendermint/vm/vm.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Godeps/_workspace/src/github.com/tendermint/tendermint/vm/vm.go b/Godeps/_workspace/src/github.com/tendermint/tendermint/vm/vm.go index 99b354f6..180b84f4 100644 --- a/Godeps/_workspace/src/github.com/tendermint/tendermint/vm/vm.go +++ b/Godeps/_workspace/src/github.com/tendermint/tendermint/vm/vm.go @@ -776,7 +776,16 @@ func (vm *VM) call(caller, callee *Account, code, input []byte, value int64, gas return nil, ErrPermission{"call"} } gasLimit := stack.Pop64() - addr, value := stack.Pop(), stack.Pop64() + addr := stack.Pop() + // NOTE: for DELEGATECALL value is preserved from the original + // caller, as such it is not stored on stack for the address + // to be called; for CALL and CALLCODE value is stored on stack + // and needs to be overwritten from the given value. + // TODO: [ben] assert that malicious code cannot produce + // new value. + if op != DELEGATECALL { + value = stack.Pop64() + } inOffset, inSize := stack.Pop64(), stack.Pop64() // inputs retOffset, retSize := stack.Pop64(), stack.Pop64() // outputs dbg.Printf(" => %X\n", addr) -- GitLab