From eb1b727252e894fac36d232acf6f1cc445853305 Mon Sep 17 00:00:00 2001 From: Johannes Hense Date: Mon, 19 Sep 2016 14:57:59 +0200 Subject: [PATCH] whisper, event/filter: added mutex sync for whisper keys and filter watchers --- event/filter/filter.go | 16 ++++++++++++---- whisper/whisper.go | 9 ++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/event/filter/filter.go b/event/filter/filter.go index b1fbf30ee4..bcacc06c56 100644 --- a/event/filter/filter.go +++ b/event/filter/filter.go @@ -17,7 +17,10 @@ // Package filter implements event filters. package filter -import "reflect" +import ( + "reflect" + "sync" +) type Filter interface { Compare(Filter) bool @@ -30,9 +33,10 @@ type FilterEvent struct { } type Filters struct { - id int - watchers map[int]Filter - ch chan FilterEvent + id int + watchers map[int]Filter + watcherMu sync.RWMutex + ch chan FilterEvent quit chan struct{} } @@ -58,14 +62,18 @@ func (self *Filters) Notify(filter Filter, data interface{}) { } func (self *Filters) Install(watcher Filter) int { + self.watcherMu.Lock() self.watchers[self.id] = watcher self.id++ + self.watcherMu.Unlock() return self.id - 1 } func (self *Filters) Uninstall(id int) { + self.watcherMu.Lock() delete(self.watchers, id) + self.watcherMu.Unlock() } func (self *Filters) loop() { diff --git a/whisper/whisper.go b/whisper/whisper.go index 0a49c1000b..b35abbf40c 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -64,7 +64,8 @@ type Whisper struct { protocol p2p.Protocol filters *filter.Filters - keys map[string]*ecdsa.PrivateKey + keys map[string]*ecdsa.PrivateKey + keyMu sync.RWMutex messages map[common.Hash]*Envelope // Pool of messages currently tracked by this node expirations map[uint32]*set.SetNonTS // Message expiration pool (TODO: something lighter) @@ -129,7 +130,9 @@ func (self *Whisper) NewIdentity() *ecdsa.PrivateKey { if err != nil { panic(err) } + self.keyMu.Lock() self.keys[string(crypto.FromECDSAPub(&key.PublicKey))] = key + self.keyMu.Unlock() return key } @@ -300,15 +303,19 @@ func (self *Whisper) open(envelope *Envelope) *Message { } } // Iterate over the keys and try to decrypt the message + self.keyMu.Lock() for _, key := range self.keys { message, err := envelope.Open(key) if err == nil { message.To = &key.PublicKey + self.keyMu.Unlock() return message } else if err == ecies.ErrInvalidPublicKey { + self.keyMu.Unlock() return message } } + self.keyMu.Unlock() // Failed to decrypt, don't return anything return nil }