From f1a7f2fc9d0b7de097a230f89c131685b6a7dc1d Mon Sep 17 00:00:00 2001 From: oysheng <33340252+oysheng@users.noreply.github.com> Date: Fri, 28 Jun 2019 12:29:05 +0800 Subject: [PATCH] fix array out of index range (#231) --- protocol/block.go | 2 +- protocol/block_test.go | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/protocol/block.go b/protocol/block.go index a1d5830d..0eafe279 100644 --- a/protocol/block.go +++ b/protocol/block.go @@ -205,7 +205,7 @@ func (c *Chain) reorganizeChain(blockHeader *types.BlockHeader) error { log.WithFields(log.Fields{"module": logModule, "height": blockHeader.Height, "hash": blockHash.String()}).Debug("attach from mainchain") } - if detachBlockHeaders[len(detachBlockHeaders)-1].Height <= c.bestIrrBlockHeader.Height && irrBlockHeader.Height <= c.bestIrrBlockHeader.Height { + if len(detachBlockHeaders) > 0 && detachBlockHeaders[len(detachBlockHeaders)-1].Height <= c.bestIrrBlockHeader.Height && irrBlockHeader.Height <= c.bestIrrBlockHeader.Height { return errors.New("rollback block below the height of irreversible block") } voteResults = append(voteResults, voteResult.Fork()) diff --git a/protocol/block_test.go b/protocol/block_test.go index cde41880..6fbb6dfa 100644 --- a/protocol/block_test.go +++ b/protocol/block_test.go @@ -71,12 +71,26 @@ func TestCalcReorganizeChain(t *testing.T) { c.store.SaveBlockHeader(newChainBlockHeader) } + // normal getAttachBlockHeaders, getDetachBlockHeaders, _ := c.calcReorganizeChain(newChainBlockHeader, mainChainBlockHeader) if !testutil.DeepEqual(wantAttachBlockHeaders, getAttachBlockHeaders) { - t.Errorf("attach headers want %v but get %v", wantAttachBlockHeaders, getAttachBlockHeaders) + t.Errorf("normal test: attach headers want %v but get %v", wantAttachBlockHeaders, getAttachBlockHeaders) } if !testutil.DeepEqual(wantDetachBlockHeaders, getDetachBlockHeaders) { - t.Errorf("detach headers want %v but get %v", wantDetachBlockHeaders, getDetachBlockHeaders) + t.Errorf("normal test: detach headers want %v but get %v", wantDetachBlockHeaders, getDetachBlockHeaders) + } + + // detachBlockHeaders is empty + forkChainBlockHeader := wantAttachBlockHeaders[7] + wantAttachBlockHeaders = wantAttachBlockHeaders[8:] + wantDetachBlockHeaders = []*types.BlockHeader{} + getAttachBlockHeaders, getDetachBlockHeaders, _ = c.calcReorganizeChain(newChainBlockHeader, forkChainBlockHeader) + if !testutil.DeepEqual(wantAttachBlockHeaders, getAttachBlockHeaders) { + t.Errorf("detachBlockHeaders is empty test: attach headers want %v but get %v", wantAttachBlockHeaders, getAttachBlockHeaders) + } + + if !testutil.DeepEqual(wantDetachBlockHeaders, getDetachBlockHeaders) { + t.Errorf("detachBlockHeaders is empty test: detach headers want %v but get %v", wantDetachBlockHeaders, getDetachBlockHeaders) } } -- 2.11.0