Browse Source

cs: limit max bit array size and block parts count

v0.31
Anton Kaliaev 5 years ago
committed by Jack Zampolin
parent
commit
1abbdcb7a5
3 changed files with 18 additions and 0 deletions
  1. +9
    -0
      consensus/reactor.go
  2. +3
    -0
      types/params.go
  3. +6
    -0
      types/vote_set.go

+ 9
- 0
consensus/reactor.go View File

@ -1457,6 +1457,9 @@ func (m *NewValidBlockMessage) ValidateBasic() error {
m.BlockParts.Size(), m.BlockParts.Size(),
m.BlockPartsHeader.Total) m.BlockPartsHeader.Total)
} }
if m.BlockParts.Size() > types.MaxBlockPartsCount {
return errors.Errorf("BlockParts bit array is too big: %d, max: %d", m.BlockParts.Size(), types.MaxBlockPartsCount)
}
return nil return nil
} }
@ -1503,6 +1506,9 @@ func (m *ProposalPOLMessage) ValidateBasic() error {
if m.ProposalPOL.Size() == 0 { if m.ProposalPOL.Size() == 0 {
return errors.New("Empty ProposalPOL bit array") return errors.New("Empty ProposalPOL bit array")
} }
if m.ProposalPOL.Size() > types.MaxVotesCount {
return errors.Errorf("ProposalPOL bit array is too big: %d, max: %d", m.ProposalPOL.Size(), types.MaxVotesCount)
}
return nil return nil
} }
@ -1646,6 +1652,9 @@ func (m *VoteSetBitsMessage) ValidateBasic() error {
return fmt.Errorf("Wrong BlockID: %v", err) return fmt.Errorf("Wrong BlockID: %v", err)
} }
// NOTE: Votes.Size() can be zero if the node does not have any // NOTE: Votes.Size() can be zero if the node does not have any
if m.Votes.Size() > types.MaxVotesCount {
return fmt.Errorf("Votes bit array is too big: %d, max: %d", m.Votes.Size(), types.MaxVotesCount)
}
return nil return nil
} }


+ 3
- 0
types/params.go View File

@ -12,6 +12,9 @@ const (
// BlockPartSizeBytes is the size of one block part. // BlockPartSizeBytes is the size of one block part.
BlockPartSizeBytes = 65536 // 64kB BlockPartSizeBytes = 65536 // 64kB
// MaxBlockPartsCount is the maximum count of block parts.
MaxBlockPartsCount = MaxBlockSizeBytes / BlockPartSizeBytes
) )
// ConsensusParams contains consensus critical parameters that determine the // ConsensusParams contains consensus critical parameters that determine the


+ 6
- 0
types/vote_set.go View File

@ -11,6 +11,12 @@ import (
cmn "github.com/tendermint/tendermint/libs/common" cmn "github.com/tendermint/tendermint/libs/common"
) )
const (
// MaxVotesCount is the maximum votes count. Used in ValidateBasic funcs for
// protection against DOS attacks.
MaxVotesCount = 10000
)
// UNSTABLE // UNSTABLE
// XXX: duplicate of p2p.ID to avoid dependence between packages. // XXX: duplicate of p2p.ID to avoid dependence between packages.
// Perhaps we can have a minimal types package containing this (and other things?) // Perhaps we can have a minimal types package containing this (and other things?)


Loading…
Cancel
Save