diff options
author | gluk256 <gluk256@users.noreply.github.com> | 2019-01-21 22:22:51 +0800 |
---|---|---|
committer | Anton Evangelatov <anton.evangelatov@gmail.com> | 2019-01-21 22:22:51 +0800 |
commit | 105008b6a121ade656bf63125cecb467e2434d95 (patch) | |
tree | c135dff1934269d80999b12f8b70204f8c2cefb8 | |
parent | 15b9b39e6c38801dd74e3b7e779018f20f510128 (diff) | |
download | go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar.gz go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar.bz2 go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar.lz go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar.xz go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.tar.zst go-tangerine-105008b6a121ade656bf63125cecb467e2434d95.zip |
swarm/pss: fixing race condition (#18487)
-rw-r--r-- | swarm/pss/pss.go | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/swarm/pss/pss.go b/swarm/pss/pss.go index bee64b0df..a80f01708 100644 --- a/swarm/pss/pss.go +++ b/swarm/pss/pss.go @@ -340,6 +340,7 @@ func (p *Pss) Register(topic *Topic, hndlr *handler) func() { } return func() { p.deregister(topic, hndlr) } } + func (p *Pss) deregister(topic *Topic, hndlr *handler) { p.handlersMu.Lock() defer p.handlersMu.Unlock() @@ -362,13 +363,6 @@ func (p *Pss) deregister(topic *Topic, hndlr *handler) { delete(handlers, hndlr) } -// get all registered handlers for respective topics -func (p *Pss) getHandlers(topic Topic) map[*handler]bool { - p.handlersMu.RLock() - defer p.handlersMu.RUnlock() - return p.handlers[topic] -} - // Filters incoming messages for processing or forwarding. // Check if address partially matches // If yes, it CAN be for us, and we process it @@ -427,7 +421,6 @@ func (p *Pss) handlePssMsg(ctx context.Context, msg interface{}) error { } } return nil - } // Entry point to processing a message for which the current node can be the intended recipient. @@ -472,13 +465,22 @@ func (p *Pss) process(pssmsg *PssMsg, raw bool, prox bool) error { p.executeHandlers(psstopic, payload, from, raw, prox, asymmetric, keyid) return nil +} +// copy all registered handlers for respective topic in order to avoid data race or deadlock +func (p *Pss) getHandlers(topic Topic) (ret []*handler) { + p.handlersMu.RLock() + defer p.handlersMu.RUnlock() + for k := range p.handlers[topic] { + ret = append(ret, k) + } + return ret } func (p *Pss) executeHandlers(topic Topic, payload []byte, from PssAddress, raw bool, prox bool, asymmetric bool, keyid string) { handlers := p.getHandlers(topic) peer := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", from), []p2p.Cap{}) - for h := range handlers { + for _, h := range handlers { if !h.caps.raw && raw { log.Warn("norawhandler") continue |