From 5107988fb52cf7f0ba0500fdbc11e72952a93d57 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 11 Jul 2015 13:25:42 -0700 Subject: [PATCH] Call peer.stop() if we're not going to start() it --- common/repeat_timer.go | 1 + p2p/switch.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/common/repeat_timer.go b/common/repeat_timer.go index ce491f20..2822b968 100644 --- a/common/repeat_timer.go +++ b/common/repeat_timer.go @@ -6,6 +6,7 @@ import "sync" /* RepeatTimer repeatedly sends a struct{}{} to .Ch after each "dur" period. It's good for keeping connections alive. +A RepeatTimer must be Stop()'d or it will keep a goroutine alive. */ type RepeatTimer struct { Ch chan time.Time diff --git a/p2p/switch.go b/p2p/switch.go index 7def88dc..f522a9a2 100644 --- a/p2p/switch.go +++ b/p2p/switch.go @@ -156,13 +156,16 @@ func (sw *Switch) Stop() { } // NOTE: This performs a blocking handshake before the peer is added. +// CONTRACT: Iff error is returned, peer is nil, and conn is immediately closed. func (sw *Switch) AddPeerWithConnection(conn net.Conn, outbound bool) (*Peer, error) { // First, perform handshake peerNodeInfo, err := peerHandshake(conn, sw.nodeInfo) if err != nil { + conn.Close() return nil, err } if err := sw.nodeInfo.CompatibleWith(peerNodeInfo); err != nil { + conn.Close() return nil, err } @@ -183,6 +186,7 @@ func (sw *Switch) AddPeerWithConnection(conn net.Conn, outbound bool) (*Peer, er log.Info("Added peer", "peer", peer) } else { log.Info("Ignoring duplicate peer", "peer", peer) + peer.stop() // will also close conn return nil, ErrSwitchDuplicatePeer }