diff --git a/p2p/peer.go b/p2p/peer.go index 3652c4654..2efe55d26 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -210,7 +210,7 @@ func (p *peer) PubKey() crypto.PubKeyEd25519 { if p.config.AuthEnc { return p.conn.(*SecretConnection).RemotePubKey() } - if p.NodeInfo == nil { + if p.NodeInfo() == nil { panic("Attempt to get peer's PubKey before calling Handshake") } return p.PubKey() @@ -306,6 +306,9 @@ func (p *peer) Key() string { // NodeInfo returns a copy of the peer's NodeInfo. func (p *peer) NodeInfo() *NodeInfo { + if p.nodeInfo == nil { + return nil + } n := *p.nodeInfo // copy return &n } diff --git a/p2p/pex_reactor.go b/p2p/pex_reactor.go index 2f13703ef..e2ccff424 100644 --- a/p2p/pex_reactor.go +++ b/p2p/pex_reactor.go @@ -103,7 +103,7 @@ func (r *PEXReactor) AddPeer(p Peer) { } else { // For inbound connections, the peer is its own source addr, err := NewNetAddressString(p.NodeInfo().ListenAddr) if err != nil { - // this should never happen + // peer gave us a bad ListenAddr. TODO: punish r.Logger.Error("Error in AddPeer: invalid peer address", "addr", p.NodeInfo().ListenAddr, "err", err) return } @@ -120,7 +120,12 @@ func (r *PEXReactor) RemovePeer(p Peer, reason interface{}) { // Receive implements Reactor by handling incoming PEX messages. func (r *PEXReactor) Receive(chID byte, src Peer, msgBytes []byte) { srcAddrStr := src.NodeInfo().RemoteAddr - srcAddr, _ := NewNetAddressString(srcAddrStr) + srcAddr, err := NewNetAddressString(srcAddrStr) + if err != nil { + // this should never happen. TODO: cancel conn + r.Logger.Error("Error in Receive: invalid peer address", "addr", srcAddrStr, "err", err) + return + } r.IncrementMsgCountForPeer(srcAddrStr) if r.ReachedMaxMsgCountForPeer(srcAddrStr) { diff --git a/p2p/switch.go b/p2p/switch.go index 62f44d8fc..2012897af 100644 --- a/p2p/switch.go +++ b/p2p/switch.go @@ -24,7 +24,7 @@ type Reactor interface { GetChannels() []*ChannelDescriptor AddPeer(peer Peer) RemovePeer(peer Peer, reason interface{}) - Receive(chID byte, peer Peer, msgBytes []byte) + Receive(chID byte, peer Peer, msgBytes []byte) // CONTRACT: msgBytes are not nil } //--------------------------------------