Skip to content

Commit bcfc17a

Browse files
committed
[FAB-3496] Nil check missing after proto unmarshal
Since proto.Unmarshal may return nil and at the same time, inner structs might have a nil reference, and the following case is possible: logger.Debug("New block with sequence number ", payload.SeqNum, " transactions num ", len(rawblock.Data.Data)) the block that is received, has a nil Data, and then Data.Data would result in a null pointer panic. Change-Id: Ie8dc958ac2932fabfcbc1b3ffaf1fbe819643193 Signed-off-by: Yacov Manevich <[email protected]>
1 parent d6fbfcf commit bcfc17a

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

gossip/state/state.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -425,13 +425,18 @@ func (s *GossipStateProviderImpl) deliverPayloads() {
425425
logger.Debugf("Ready to transfer payloads to the ledger, next sequence number is = [%d]", s.payloads.Next())
426426
// Collect all subsequent payloads
427427
for payload := s.payloads.Pop(); payload != nil; payload = s.payloads.Pop() {
428-
rawblock := &common.Block{}
429-
if err := pb.Unmarshal(payload.Data, rawblock); err != nil {
428+
rawBlock := &common.Block{}
429+
if err := pb.Unmarshal(payload.Data, rawBlock); err != nil {
430430
logger.Errorf("Error getting block with seqNum = %d due to (%s)...dropping block", payload.SeqNum, err)
431431
continue
432432
}
433-
logger.Debug("New block with sequence number ", payload.SeqNum, " transactions num ", len(rawblock.Data.Data))
434-
s.commitBlock(rawblock)
433+
if rawBlock.Data == nil || rawBlock.Header == nil {
434+
logger.Errorf("Block with claimed sequence %d has no header (%v) or data (%v)",
435+
payload.SeqNum, rawBlock.Header, rawBlock.Data)
436+
continue
437+
}
438+
logger.Debug("New block with claimed sequence number ", payload.SeqNum, " transactions num ", len(rawBlock.Data.Data))
439+
s.commitBlock(rawBlock)
435440
}
436441
case <-s.stopCh:
437442
s.stopCh <- struct{}{}

0 commit comments

Comments
 (0)