Skip to content

Commit bbdd2c1

Browse files
committed
[FAB-13813] fix uint64 overflow in gossip/state
Change-Id: Ibf88f27f6ee1e998389f2b727630d43bbfcfe151 Signed-off-by: Artem Barger <bartem@il.ibm.com>
1 parent 9f3b0df commit bbdd2c1

File tree

2 files changed

+47
-10
lines changed

2 files changed

+47
-10
lines changed

gossip/state/state.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,29 @@ type GossipStateProviderImpl struct {
150150
stateTransferActive int32
151151

152152
stateMetrics *metrics.StateMetrics
153+
154+
requestValidator *stateRequestValidator
153155
}
154156

155157
var logger = util.GetLogger(util.StateLogger, "")
156158

159+
// stateRequestValidator facilitates validation of the state request messages
160+
type stateRequestValidator struct {
161+
}
162+
163+
// validate checks for RemoteStateRequest message validity
164+
func (v *stateRequestValidator) validate(request *proto.RemoteStateRequest) error {
165+
if request.StartSeqNum > request.EndSeqNum {
166+
return errors.Errorf("Invalid sequence interval [%d...%d).", request.StartSeqNum, request.EndSeqNum)
167+
}
168+
169+
if request.EndSeqNum > defAntiEntropyBatchSize+request.StartSeqNum {
170+
return errors.Errorf("Requesting blocks range [%d-%d) greater than configured allowed"+
171+
" (%d) batching size for anti-entropy.", request.StartSeqNum, request.EndSeqNum, defAntiEntropyBatchSize)
172+
}
173+
return nil
174+
}
175+
157176
// NewGossipStateProvider creates state provider with coordinator instance
158177
// to orchestrate arrival of private rwsets and blocks before committing them into the ledger.
159178
func NewGossipStateProvider(chainID string, services *ServicesMediator, ledger ledgerResources, stateMetrics *metrics.StateMetrics) GossipStateProvider {
@@ -233,6 +252,8 @@ func NewGossipStateProvider(chainID string, services *ServicesMediator, ledger l
233252
once: sync.Once{},
234253

235254
stateMetrics: stateMetrics,
255+
256+
requestValidator: &stateRequestValidator{},
236257
}
237258

238259
logger.Infof("Updating metadata information, "+
@@ -391,21 +412,14 @@ func (s *GossipStateProviderImpl) handleStateRequest(msg proto.ReceivedMessage)
391412
}
392413
request := msg.GetGossipMessage().GetStateRequest()
393414

394-
batchSize := request.EndSeqNum - request.StartSeqNum
395-
if batchSize > defAntiEntropyBatchSize {
396-
logger.Errorf("Requesting blocks batchSize size (%d) greater than configured allowed"+
397-
" (%d) batching for anti-entropy. Ignoring request...", batchSize, defAntiEntropyBatchSize)
398-
return
399-
}
400-
401-
if request.StartSeqNum > request.EndSeqNum {
402-
logger.Errorf("Invalid sequence interval [%d...%d], ignoring request...", request.StartSeqNum, request.EndSeqNum)
415+
if err := s.requestValidator.validate(request); err != nil {
416+
logger.Errorf("State request validation failed, %s. Ignoring request...", err)
403417
return
404418
}
405419

406420
currentHeight, err := s.ledger.LedgerHeight()
407421
if err != nil {
408-
logger.Errorf("Cannot access to current ledger height, due to %+v", errors.WithStack(err))
422+
logger.Errorf("Cannot access to current ledger height, due to %+v", err)
409423
return
410424
}
411425
if currentHeight < request.EndSeqNum {

gossip/state/state_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,6 +1664,29 @@ func TestTransferOfPvtDataBetweenPeers(t *testing.T) {
16641664
}
16651665
}
16661666

1667+
func TestStateRequestValidator(t *testing.T) {
1668+
validator := &stateRequestValidator{}
1669+
err := validator.validate(&proto.RemoteStateRequest{
1670+
StartSeqNum: 10,
1671+
EndSeqNum: 5,
1672+
})
1673+
assert.Contains(t, err.Error(), "Invalid sequence interval [10...5).")
1674+
assert.Error(t, err)
1675+
1676+
err = validator.validate(&proto.RemoteStateRequest{
1677+
StartSeqNum: 10,
1678+
EndSeqNum: 30,
1679+
})
1680+
assert.Contains(t, err.Error(), "Requesting blocks range [10-30) greater than configured")
1681+
assert.Error(t, err)
1682+
1683+
err = validator.validate(&proto.RemoteStateRequest{
1684+
StartSeqNum: 10,
1685+
EndSeqNum: 20,
1686+
})
1687+
assert.NoError(t, err)
1688+
}
1689+
16671690
func waitUntilTrueOrTimeout(t *testing.T, predicate func() bool, timeout time.Duration) {
16681691
ch := make(chan struct{})
16691692
go func() {

0 commit comments

Comments
 (0)