aboutsummaryrefslogtreecommitdiffstats
path: root/vm/vm.go
diff options
context:
space:
mode:
Diffstat (limited to 'vm/vm.go')
-rw-r--r--vm/vm.go28
1 files changed, 18 insertions, 10 deletions
diff --git a/vm/vm.go b/vm/vm.go
index a47818a44..089047a95 100644
--- a/vm/vm.go
+++ b/vm/vm.go
@@ -443,13 +443,16 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
self.Printf(" => %d", l)
case CALLDATACOPY:
var (
- mOff = stack.pop().Uint64()
- cOff = stack.pop().Uint64()
- l = stack.pop().Uint64()
+ mOff = stack.pop()
+ cOff = stack.pop()
+ l = stack.pop()
)
- data := getData(callData, cOff, l)
+ var data []byte
+ if cOff.Cmp(big.NewInt(int64(len(callData)))) <= 0 {
+ data = getData(callData, cOff.Uint64(), l.Uint64())
+ }
- mem.Set(mOff, l, data)
+ mem.Set(mOff.Uint64(), l.Uint64(), data)
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, data)
case CODESIZE, EXTCODESIZE:
@@ -473,14 +476,19 @@ func (self *Vm) Run(context *Context, callData []byte) (ret []byte, err error) {
} else {
code = context.Code
}
+
var (
- mOff = stack.pop().Uint64()
- cOff = stack.pop().Uint64()
- l = stack.pop().Uint64()
+ mOff = stack.pop()
+ cOff = stack.pop()
+ l = stack.pop()
)
- codeCopy := getData(code, cOff, l)
- mem.Set(mOff, l, codeCopy)
+ var codeCopy []byte
+ if cOff.Cmp(big.NewInt(int64(len(code)))) <= 0 {
+ codeCopy = getData(code, cOff.Uint64(), l.Uint64())
+ }
+
+ mem.Set(mOff.Uint64(), l.Uint64(), codeCopy)
self.Printf(" => [%v, %v, %v] %x", mOff, cOff, l, codeCopy)
case GASPRICE: