From dd1791c9fd87b3744dc0747153e41fe893cc727b Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 2 Apr 2015 15:32:41 +0100 Subject: [PATCH] proper locking to prevent close of closed channel crash when multiple mining peers compete --- blockpool/peers.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/blockpool/peers.go b/blockpool/peers.go index 615058e26..802081780 100644 --- a/blockpool/peers.go +++ b/blockpool/peers.go @@ -219,6 +219,7 @@ func (self *peers) addPeer( return } self.lock.Lock() + defer self.lock.Unlock() p, found := self.peers[id] if found { // when called on an already connected peer, it means a newBlockMsg is received @@ -243,7 +244,6 @@ func (self *peers) addPeer( plog.Debugf("addPeer: add new peer <%v> with td %v and current block %s", id, td, hex(currentBlockHash)) } - self.lock.Unlock() // check if peer's current head block is known if self.bp.hasBlock(currentBlockHash) { @@ -269,7 +269,10 @@ func (self *peers) addPeer( } else { // baseline is our own TD currentTD := self.bp.getTD() - if self.best != nil { + bestpeer := self.best + if bestpeer != nil { + bestpeer.lock.Lock() + defer bestpeer.lock.Unlock() currentTD = self.best.td } if td.Cmp(currentTD) > 0 { @@ -277,11 +280,12 @@ func (self *peers) addPeer( self.status.bestPeers[p.id]++ self.status.lock.Unlock() plog.Debugf("addPeer: peer <%v> (td: %v > current td %v) promoted best peer", id, td, currentTD) - self.bp.switchPeer(self.best, p) + self.bp.switchPeer(bestpeer, p) self.best = p best = true } } + return }