OSDN Git Service

fix array out of index range (#231)
authoroysheng <33340252+oysheng@users.noreply.github.com>
Fri, 28 Jun 2019 04:29:05 +0000 (12:29 +0800)
committerPaladz <yzhu101@uottawa.ca>
Fri, 28 Jun 2019 04:29:05 +0000 (12:29 +0800)
protocol/block.go
protocol/block_test.go

index a1d5830..0eafe27 100644 (file)
@@ -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())
index cde4188..6fbb6df 100644 (file)
@@ -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)
        }
 }