diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-04-22 22:40:39 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-04-28 15:49:05 +0800 |
commit | 406e74e2afdce374fd227873f4eb96a0ba99bd23 (patch) | |
tree | af605ae0512e7dab0802f0f8ebebe2e02f2798c1 /whisper | |
parent | 70ded4cbf06d19993d829d843a27002cf181c619 (diff) | |
download | dexon-406e74e2afdce374fd227873f4eb96a0ba99bd23.tar.gz dexon-406e74e2afdce374fd227873f4eb96a0ba99bd23.tar.zst dexon-406e74e2afdce374fd227873f4eb96a0ba99bd23.zip |
whisper: fix a small data race duirng peer connection
Diffstat (limited to 'whisper')
-rw-r--r-- | whisper/peer.go | 8 | ||||
-rw-r--r-- | whisper/whisper.go | 18 |
2 files changed, 12 insertions, 14 deletions
diff --git a/whisper/peer.go b/whisper/peer.go index 28abf4260..77e09bece 100644 --- a/whisper/peer.go +++ b/whisper/peer.go @@ -23,18 +23,14 @@ type peer struct { // newPeer creates and initializes a new whisper peer connection, returning either // the newly constructed link or a failure reason. -func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) (*peer, error) { - p := &peer{ +func newPeer(host *Whisper, remote *p2p.Peer, rw p2p.MsgReadWriter) *peer { + return &peer{ host: host, peer: remote, ws: rw, known: set.New(), quit: make(chan struct{}), } - if err := p.handshake(); err != nil { - return nil, err - } - return p, nil } // start initiates the peer updater, periodically broadcasting the whisper packets diff --git a/whisper/whisper.go b/whisper/whisper.go index 5d6ee6e3b..a48e1e380 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -168,15 +168,9 @@ func (self *Whisper) Messages(id int) []*Message { // handlePeer is called by the underlying P2P layer when the whisper sub-protocol // connection is negotiated. func (self *Whisper) handlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - // Create, initialize and start the whisper peer - whisperPeer, err := newPeer(self, peer, rw) - if err != nil { - return err - } - whisperPeer.start() - defer whisperPeer.stop() + // Create the new peer and start tracking it + whisperPeer := newPeer(self, peer, rw) - // Start tracking the active peer self.peerMu.Lock() self.peers[whisperPeer] = struct{}{} self.peerMu.Unlock() @@ -186,6 +180,14 @@ func (self *Whisper) handlePeer(peer *p2p.Peer, rw p2p.MsgReadWriter) error { delete(self.peers, whisperPeer) self.peerMu.Unlock() }() + + // Run the peer handshake and state updates + if err := whisperPeer.handshake(); err != nil { + return err + } + whisperPeer.start() + defer whisperPeer.stop() + // Read and process inbound messages directly to merge into client-global state for { // Fetch the next packet and decode the contained envelopes |