aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-08-08 19:04:18 +0800
committerobscuren <geffobscura@gmail.com>2014-08-08 19:04:18 +0800
commit3fc24013ef200f20eaa9deed6647270924126976 (patch)
tree6d3e02804cf555680604558aca98a473faa58400
parentd6b0ab3028ba8d7a565d35ab7b8054ee921ba683 (diff)
downloaddexon-3fc24013ef200f20eaa9deed6647270924126976.tar.gz
dexon-3fc24013ef200f20eaa9deed6647270924126976.tar.zst
dexon-3fc24013ef200f20eaa9deed6647270924126976.zip
Fixed issue with overflowing 256 bit integers
-rw-r--r--ethvm/vm.go31
1 files changed, 31 insertions, 0 deletions
diff --git a/ethvm/vm.go b/ethvm/vm.go
index e469fa826..995fd897b 100644
--- a/ethvm/vm.go
+++ b/ethvm/vm.go
@@ -245,6 +245,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Add(y, x)
+ ensure256(base)
+
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
@@ -255,6 +257,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Sub(y, x)
+ ensure256(base)
+
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
@@ -265,6 +269,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Mul(y, x)
+ ensure256(base)
+
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
@@ -277,6 +283,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Div(y, x)
}
+ ensure256(base)
+
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
@@ -289,6 +297,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Div(y, x)
}
+ ensure256(base)
+
self.Printf(" = %v", base)
// Pop result back on the stack
stack.Push(base)
@@ -300,6 +310,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Mod(y, x)
+ ensure256(base)
+
self.Printf(" = %v", base)
stack.Push(base)
case SMOD:
@@ -310,6 +322,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Mod(y, x)
+ ensure256(base)
+
self.Printf(" = %v", base)
stack.Push(base)
@@ -321,6 +335,8 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
base.Exp(y, x, Pow256)
+ ensure256(base)
+
self.Printf(" = %v", base)
stack.Push(base)
@@ -838,3 +854,18 @@ func (self *Vm) Endl() *Vm {
return self
}
+
+func ensure256(x *big.Int) {
+ maxInt, _ := new(big.Int).SetString("115792089237316195423570985008687907853269984665640564039457584007913129639935", 0)
+ if x.Cmp(maxInt) >= 0 {
+ x.SetInt64(0)
+
+ return
+ }
+
+ // Could have done this with an OR, but big ints are costly.
+
+ if x.Cmp(new(big.Int)) < 0 {
+ x.SetInt64(0)
+ }
+}