Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restrict direct stack usage in opfns #240

Merged
merged 2 commits into from
Dec 17, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions lib/opFns.js
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,8 @@ module.exports = {
return loaded
},
DUP: function (runState) {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually for DUP we could change the opcodes table to say takes 1 off and pushes 2 new items, but that makes it just more complex here.

// NOTE: this function manipulates the stack directly!

const stackPos = runState.opCode - 0x7f
if (stackPos > runState.stack.length) {
trap(ERROR.STACK_UNDERFLOW)
Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -1023,8 +1028,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]))
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is the reason which makes #222 fail on calls.

} else {
// if creating a new contract then increament the nonce
if (!callOptions.to) {
Expand Down