Browse Source

miner, rpc: added length check for extra data

Jeffrey Wilcke 10 years ago
parent
commit
132df860d9
2 changed files with 10 additions and 7 deletions
  1. 8 1
      miner/miner.go
  2. 2 6
      rpc/api/miner.go

+ 8 - 1
miner/miner.go

@@ -18,6 +18,7 @@
 package miner
 package miner
 
 
 import (
 import (
+	"fmt"
 	"math/big"
 	"math/big"
 	"sync/atomic"
 	"sync/atomic"
 
 
@@ -29,6 +30,7 @@ import (
 	"github.com/ethereum/go-ethereum/event"
 	"github.com/ethereum/go-ethereum/event"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/logger/glog"
 	"github.com/ethereum/go-ethereum/logger/glog"
+	"github.com/ethereum/go-ethereum/params"
 	"github.com/ethereum/go-ethereum/pow"
 	"github.com/ethereum/go-ethereum/pow"
 )
 )
 
 
@@ -143,8 +145,13 @@ func (self *Miner) HashRate() int64 {
 	return self.pow.GetHashrate()
 	return self.pow.GetHashrate()
 }
 }
 
 
-func (self *Miner) SetExtra(extra []byte) {
+func (self *Miner) SetExtra(extra []byte) error {
+	if uint64(len(extra)) > params.MaximumExtraDataSize.Uint64() {
+		return fmt.Errorf("Extra exceeds max length. %d > %v", len(extra), params.MaximumExtraDataSize)
+	}
+
 	self.worker.extra = extra
 	self.worker.extra = extra
+	return nil
 }
 }
 
 
 func (self *Miner) PendingState() *state.StateDB {
 func (self *Miner) PendingState() *state.StateDB {

+ 2 - 6
rpc/api/miner.go

@@ -17,12 +17,9 @@
 package api
 package api
 
 
 import (
 import (
-	"fmt"
-
 	"github.com/ethereum/ethash"
 	"github.com/ethereum/ethash"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/eth"
 	"github.com/ethereum/go-ethereum/eth"
-	"github.com/ethereum/go-ethereum/params"
 	"github.com/ethereum/go-ethereum/rpc/codec"
 	"github.com/ethereum/go-ethereum/rpc/codec"
 	"github.com/ethereum/go-ethereum/rpc/shared"
 	"github.com/ethereum/go-ethereum/rpc/shared"
 )
 )
@@ -126,11 +123,10 @@ func (self *minerApi) SetExtra(req *shared.Request) (interface{}, error) {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
-	if uint64(len(args.Data)) > params.MaximumExtraDataSize.Uint64()*2 {
-		return false, fmt.Errorf("extra datasize can be no longer than %v bytes", params.MaximumExtraDataSize)
+	if err := self.ethereum.Miner().SetExtra([]byte(args.Data)); err != nil {
+		return false, err
 	}
 	}
 
 
-	self.ethereum.Miner().SetExtra([]byte(args.Data))
 	return true, nil
 	return true, nil
 }
 }