diff --git a/p2p/pex_reactor.go b/p2p/pex_reactor.go index b00f2cee1..93e57e6da 100644 --- a/p2p/pex_reactor.go +++ b/p2p/pex_reactor.go @@ -212,10 +212,11 @@ func (pexR *PEXReactor) ensurePeers() { // if no addresses to dial, pick a random connected peer and ask for more peers if toDial.Size() == 0 { - peers := pexR.sw.Peers().List() - i := rand.Int() % len(peers) - log.Debug("No addresses to dial. Sending pexRequest to random peer", "peer", peers[i]) - pexR.RequestPEX(peers[i]) + if peers := pexR.sw.Peers().List(); len(peers) > 0 { + i := rand.Int() % len(peers) + log.Debug("No addresses to dial. Sending pexRequest to random peer", "peer", peers[i]) + pexR.RequestPEX(peers[i]) + } } } diff --git a/p2p/switch.go b/p2p/switch.go index 17dd17413..b2584c8c0 100644 --- a/p2p/switch.go +++ b/p2p/switch.go @@ -171,10 +171,16 @@ func (sw *Switch) AddPeerWithConnection(conn net.Conn, outbound bool) (*Peer, er conn.Close() return nil, err } + // check version, chain id if err := sw.nodeInfo.CompatibleWith(peerNodeInfo); err != nil { conn.Close() return nil, err } + // avoid self + if peerNodeInfo.UUID == sw.nodeInfo.UUID { + conn.Close() + return nil, fmt.Errorf("Ignoring connection from self") + } // the peerNodeInfo is not verified, // so we overwrite the IP with that from the conn diff --git a/p2p/switch_test.go b/p2p/switch_test.go index 209defcc6..41bf489ab 100644 --- a/p2p/switch_test.go +++ b/p2p/switch_test.go @@ -9,6 +9,8 @@ import ( "github.com/tendermint/tendermint/binary" . "github.com/tendermint/tendermint/common" "github.com/tendermint/tendermint/types" + + "github.com/tendermint/tendermint/Godeps/_workspace/src/code.google.com/p/go-uuid/uuid" ) type PeerMessage struct { @@ -78,12 +80,14 @@ func makeSwitchPair(t testing.TB, initSwitch func(*Switch) *Switch) (*Switch, *S Moniker: "switch1", ChainID: "testing", Version: "123.123.123", + UUID: uuid.New(), }) s2 := initSwitch(NewSwitch()) s2.SetNodeInfo(&types.NodeInfo{ Moniker: "switch2", ChainID: "testing", Version: "123.123.123", + UUID: uuid.New(), }) // Start switches