From 4d77c8713f358efe2d200c285ce4bb46a3aec68d Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 15 Dec 2017 14:47:38 +0000 Subject: [PATCH 1/2] Do not manipulate stack directly in CALLs --- lib/opFns.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/opFns.js b/lib/opFns.js index 71c5a8d3ac..9d9308270a 100644 --- a/lib/opFns.js +++ b/lib/opFns.js @@ -1023,8 +1023,7 @@ function makeCall (runState, callOptions, localOpts, cb) { // check if account has enough ether // Note: in the case of delegatecall, the value is persisted and doesn't need to be deducted again if (runState.depth >= fees.stackLimit.v || (callOptions.delegatecall !== true && new BN(runState.contract.balance).lt(callOptions.value))) { - runState.stack.push(Buffer.from([0])) - cb(null) + cb(null, Buffer.from([0])) } else { // if creating a new contract then increament the nonce if (!callOptions.to) { From 86308eb06bae661b8e6058c3e93b306461c6fad8 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 15 Dec 2017 14:51:13 +0000 Subject: [PATCH 2/2] Manipulate the stack items directly in SWAP --- lib/opFns.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/opFns.js b/lib/opFns.js index 9d9308270a..2d3ba8e217 100644 --- a/lib/opFns.js +++ b/lib/opFns.js @@ -470,6 +470,8 @@ module.exports = { return loaded }, DUP: function (runState) { + // NOTE: this function manipulates the stack directly! + const stackPos = runState.opCode - 0x7f if (stackPos > runState.stack.length) { trap(ERROR.STACK_UNDERFLOW) @@ -478,6 +480,8 @@ module.exports = { return runState.stack[runState.stack.length - stackPos] }, SWAP: function (runState) { + // NOTE: this function manipulates the stack directly! + var stackPos = runState.opCode - 0x8f // check the stack to make sure we have enough items on teh stack @@ -487,9 +491,10 @@ module.exports = { } // preform the swap - var newTop = runState.stack[swapIndex] - runState.stack[swapIndex] = runState.stack.pop() - return newTop + var topIndex = runState.stack.length - 1 + var tmp = runState.stack[topIndex] + runState.stack[topIndex] = runState.stack[swapIndex] + runState.stack[swapIndex] = tmp }, LOG: function (memOffset, memLength) { var args = Array.prototype.slice.call(arguments, 0)