aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp25
-rw-r--r--src/main.h2
2 files changed, 20 insertions, 7 deletions
diff --git a/src/main.cpp b/src/main.cpp
index ecf2fafc89..0237106dcb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2796,14 +2796,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
CAlert alert;
vRecv >> alert;
- if (alert.ProcessAlert())
+ uint256 alertHash = alert.GetHash();
+ if (pfrom->setKnown.count(alertHash) == 0)
{
- // Relay
- pfrom->setKnown.insert(alert.GetHash());
+ if (alert.ProcessAlert())
{
- LOCK(cs_vNodes);
- BOOST_FOREACH(CNode* pnode, vNodes)
- alert.RelayTo(pnode);
+ // Relay
+ pfrom->setKnown.insert(alertHash);
+ {
+ LOCK(cs_vNodes);
+ BOOST_FOREACH(CNode* pnode, vNodes)
+ alert.RelayTo(pnode);
+ }
+ }
+ else {
+ // Small DoS penalty so peers that send us lots of
+ // duplicate/expired/invalid-signature/whatever alerts
+ // eventually get banned.
+ // This isn't a Misbehaving(100) (immediate ban) because the
+ // peer might be an older or different implementation with
+ // a different signature key, etc.
+ pfrom->Misbehaving(10);
}
}
}
diff --git a/src/main.h b/src/main.h
index b9a1945861..e562cec7c4 100644
--- a/src/main.h
+++ b/src/main.h
@@ -1554,7 +1554,7 @@ public:
uint256 GetHash() const
{
- return SerializeHash(*this);
+ return Hash(this->vchMsg.begin(), this->vchMsg.end());
}
bool IsInEffect() const