diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-11-25 20:19:45 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-11-25 20:19:45 +0800 |
commit | 168d0e9e45939b7282204f3f52fe86fc8110cfc7 (patch) | |
tree | ec8ade85f4a1525eaae6fda6f34870b68a235ea9 | |
parent | b0fb48c389460193d9fc0a5118d79ff6dec48ce0 (diff) | |
parent | 5f0a4416db4339176e31fab5f4b7b79f4e7cf20b (diff) | |
download | dexon-168d0e9e45939b7282204f3f52fe86fc8110cfc7.tar.gz dexon-168d0e9e45939b7282204f3f52fe86fc8110cfc7.tar.zst dexon-168d0e9e45939b7282204f3f52fe86fc8110cfc7.zip |
Merge pull request #1996 from obscuren/whisper-spam-fix
whisper: fixed broadcast race
-rw-r--r-- | whisper/peer_test.go | 7 | ||||
-rw-r--r-- | whisper/whisper.go | 5 | ||||
-rw-r--r-- | whisper/whisper_test.go | 9 |
3 files changed, 19 insertions, 2 deletions
diff --git a/whisper/peer_test.go b/whisper/peer_test.go index 594671ee1..b3d2031c1 100644 --- a/whisper/peer_test.go +++ b/whisper/peer_test.go @@ -239,14 +239,17 @@ func TestPeerMessageExpiration(t *testing.T) { } payload := []interface{}{envelope} if err := p2p.ExpectMsg(tester.stream, messagesCode, payload); err != nil { - t.Fatalf("message mismatch: %v", err) + // A premature empty message may have been broadcast, check the next too + if err := p2p.ExpectMsg(tester.stream, messagesCode, payload); err != nil { + t.Fatalf("message mismatch: %v", err) + } } // Check that the message is inside the cache if !peer.known.Has(envelope.Hash()) { t.Fatalf("message not found in cache") } // Discard messages until expiration and check cache again - exp := time.Now().Add(time.Second + expirationCycle) + exp := time.Now().Add(time.Second + 2*expirationCycle + 100*time.Millisecond) for time.Now().Before(exp) { if err := p2p.ExpectMsg(tester.stream, messagesCode, []interface{}{}); err != nil { t.Fatalf("message mismatch: %v", err) diff --git a/whisper/whisper.go b/whisper/whisper.go index 676d8ae7a..a341f23e4 100644 --- a/whisper/whisper.go +++ b/whisper/whisper.go @@ -234,6 +234,11 @@ func (self *Whisper) add(envelope *Envelope) error { self.poolMu.Lock() defer self.poolMu.Unlock() + // short circuit when a received envelope has already expired + if envelope.Expiry <= uint32(time.Now().Unix()) { + return nil + } + // Insert the message into the tracked pool hash := envelope.Hash() if _, ok := self.messages[hash]; ok { diff --git a/whisper/whisper_test.go b/whisper/whisper_test.go index 1a9a8667a..b83ce0fe7 100644 --- a/whisper/whisper_test.go +++ b/whisper/whisper_test.go @@ -207,4 +207,13 @@ func TestMessageExpiration(t *testing.T) { if found { t.Fatalf("message not expired from cache") } + + node.add(envelope) + node.poolMu.RLock() + _, found = node.messages[envelope.Hash()] + node.poolMu.RUnlock() + if found { + t.Fatalf("message was added to cache") + } + } |