diff options
author | Jimmy Hu <jimmy.hu@dexon.org> | 2019-04-16 12:12:06 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-16 12:12:06 +0800 |
commit | 35be27df35e31ba95a8540b4e1173e29aee4e61a (patch) | |
tree | ac35e3c9f7736611e3544697aeba7ed20d59e733 | |
parent | 0845e84c9aea684da7d03c3063ebb19651c84caa (diff) | |
download | dexon-35be27df35e31ba95a8540b4e1173e29aee4e61a.tar.gz dexon-35be27df35e31ba95a8540b4e1173e29aee4e61a.tar.zst dexon-35be27df35e31ba95a8540b4e1173e29aee4e61a.zip |
core: vm: prevent setting owner to blackhole (#366)
* core: vm: prevent setting owner to blackhole
* core: vm: same for transferNodeOwner
-rw-r--r-- | core/vm/oracle_contracts.go | 6 | ||||
-rw-r--r-- | core/vm/oracle_contracts_test.go | 14 |
2 files changed, 19 insertions, 1 deletions
diff --git a/core/vm/oracle_contracts.go b/core/vm/oracle_contracts.go index b36a05d15..c82fed3cf 100644 --- a/core/vm/oracle_contracts.go +++ b/core/vm/oracle_contracts.go @@ -2607,11 +2607,17 @@ func (g *GovernanceContract) transferOwnership(newOwner common.Address) ([]byte, if g.contract.Caller() != g.state.Owner() { return nil, errExecutionReverted } + if newOwner == (common.Address{}) { + return nil, errExecutionReverted + } g.state.SetOwner(newOwner) return nil, nil } func (g *GovernanceContract) transferNodeOwnership(newOwner common.Address) ([]byte, error) { + if newOwner == (common.Address{}) { + return nil, errExecutionReverted + } caller := g.contract.Caller() offset := g.state.NodesOffsetByAddress(caller) diff --git a/core/vm/oracle_contracts_test.go b/core/vm/oracle_contracts_test.go index 4fb05a34e..bdd407abd 100644 --- a/core/vm/oracle_contracts_test.go +++ b/core/vm/oracle_contracts_test.go @@ -254,9 +254,15 @@ func (g *OracleContractsTestSuite) call( } func (g *OracleContractsTestSuite) TestTransferOwnership() { + input, err := GovernanceABI.ABI.Pack("transferOwnership", common.Address{}) + g.Require().NoError(err) + // Call with owner but invalid new owner. + _, err = g.call(GovernanceContractAddress, g.config.Owner, input, big.NewInt(0)) + g.Require().NotNil(err) + _, addr := newPrefundAccount(g.stateDB) - input, err := GovernanceABI.ABI.Pack("transferOwnership", addr) + input, err = GovernanceABI.ABI.Pack("transferOwnership", addr) g.Require().NoError(err) // Call with non-owner. @@ -282,6 +288,12 @@ func (g *OracleContractsTestSuite) TestTransferNodeOwnership() { offset := g.s.NodesOffsetByAddress(addr) + // Call with not valid new owner. + input, err = GovernanceABI.ABI.Pack("transferNodeOwnership", common.Address{}) + g.Require().NoError(err) + _, err = g.call(GovernanceContractAddress, addr, input, big.NewInt(0)) + g.Require().NotNil(err) + _, newAddr := newPrefundAccount(g.stateDB) newNodeKeyAddr := crypto.PubkeyToAddress(privKey.PublicKey) |