peer: disconnect peers that don't have our required feature bits

This commit is contained in:
Olaoluwa Osuntokun 2019-01-18 18:30:55 -08:00
parent c815821679
commit b7244244ae
No known key found for this signature in database
GPG Key ID: CE58F7F8E20FD9A2

26
peer.go

@ -958,9 +958,9 @@ func (p *peer) readHandler() {
p.Disconnect(err) p.Disconnect(err)
}) })
// Initialize our negotiated gossip sync method before reading // Initialize our negotiated gossip sync method before reading messages
// messages off the wire. When using gossip queries, this ensures // off the wire. When using gossip queries, this ensures a gossip
// a gossip syncer is active by the time query messages arrive. // syncer is active by the time query messages arrive.
// //
// TODO(conner): have peer store gossip syncer directly and bypass // TODO(conner): have peer store gossip syncer directly and bypass
// gossiper? // gossiper?
@ -2146,18 +2146,21 @@ func (p *peer) WipeChannel(chanPoint *wire.OutPoint) error {
// handleInitMsg handles the incoming init message which contains global and // handleInitMsg handles the incoming init message which contains global and
// local features vectors. If feature vectors are incompatible then disconnect. // local features vectors. If feature vectors are incompatible then disconnect.
func (p *peer) handleInitMsg(msg *lnwire.Init) error { func (p *peer) handleInitMsg(msg *lnwire.Init) error {
p.remoteLocalFeatures = lnwire.NewFeatureVector(msg.LocalFeatures, p.remoteLocalFeatures = lnwire.NewFeatureVector(
lnwire.LocalFeatures) msg.LocalFeatures, lnwire.LocalFeatures,
p.remoteGlobalFeatures = lnwire.NewFeatureVector(msg.GlobalFeatures, )
lnwire.GlobalFeatures) p.remoteGlobalFeatures = lnwire.NewFeatureVector(
msg.GlobalFeatures, lnwire.GlobalFeatures,
)
// Now that we have their features loaded, we'll ensure that they
// didn't set any required bits that we don't know of.
unknownLocalFeatures := p.remoteLocalFeatures.UnknownRequiredFeatures() unknownLocalFeatures := p.remoteLocalFeatures.UnknownRequiredFeatures()
if len(unknownLocalFeatures) > 0 { if len(unknownLocalFeatures) > 0 {
err := fmt.Errorf("Peer set unknown local feature bits: %v", err := fmt.Errorf("Peer set unknown local feature bits: %v",
unknownLocalFeatures) unknownLocalFeatures)
return err return err
} }
unknownGlobalFeatures := p.remoteGlobalFeatures.UnknownRequiredFeatures() unknownGlobalFeatures := p.remoteGlobalFeatures.UnknownRequiredFeatures()
if len(unknownGlobalFeatures) > 0 { if len(unknownGlobalFeatures) > 0 {
err := fmt.Errorf("Peer set unknown global feature bits: %v", err := fmt.Errorf("Peer set unknown global feature bits: %v",
@ -2165,6 +2168,13 @@ func (p *peer) handleInitMsg(msg *lnwire.Init) error {
return err return err
} }
// Now that we know we understand their requirements, we'll check to
// see if they don't support anything that we deem to be mandatory.
switch {
case !p.remoteLocalFeatures.HasFeature(lnwire.DataLossProtectRequired):
return fmt.Errorf("data loss protection required")
}
return nil return nil
} }