aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2015-11-25 20:19:45 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2015-11-25 20:19:45 +0800
commit168d0e9e45939b7282204f3f52fe86fc8110cfc7 (patch)
treeec8ade85f4a1525eaae6fda6f34870b68a235ea9
parentb0fb48c389460193d9fc0a5118d79ff6dec48ce0 (diff)
parent5f0a4416db4339176e31fab5f4b7b79f4e7cf20b (diff)
downloaddexon-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.go7
-rw-r--r--whisper/whisper.go5
-rw-r--r--whisper/whisper_test.go9
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")
+ }
+
}