aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLuke Dashjr <luke-jr+git@utopios.org>2012-08-27 19:14:59 +0000
committerLuke Dashjr <luke-jr+git@utopios.org>2012-08-27 19:14:59 +0000
commitf08ad34e0c7879d60d854c7014cc788e4268889f (patch)
tree4d101e8f8ba21a29026d3992abda8f2348c1c707 /src
parent802bc904ba102c19631aa2aad9659df74fe0e07e (diff)
parentd31e24aeaaf18a4117f23a937614a8bf2679e8a4 (diff)
downloadbitcoin-f08ad34e0c7879d60d854c7014cc788e4268889f.tar.xz
Merge branch '0.5.x' into 0.6.0.x
Conflicts: bitcoin-qt.pro doc/README doc/README_windows.txt share/setup.nsi src/serialize.h
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp47
-rw-r--r--src/main.h4
2 files changed, 43 insertions, 8 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 7d3432751a..129e09929a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2168,6 +2168,28 @@ bool CAlert::ProcessAlert()
if (!IsInEffect())
return false;
+ // alert.nID=max is reserved for if the alert key is
+ // compromised. It must have a pre-defined message,
+ // must never expire, must apply to all versions,
+ // and must cancel all previous
+ // alerts or it will be ignored (so an attacker can't
+ // send an "everything is OK, don't panic" version that
+ // cannot be overridden):
+ int maxInt = std::numeric_limits<int>::max();
+ if (nID == maxInt)
+ {
+ if (!(
+ nExpiration == maxInt &&
+ nCancel == (maxInt-1) &&
+ nMinVer == 0 &&
+ nMaxVer == maxInt &&
+ setSubVer.empty() &&
+ nPriority == maxInt &&
+ strStatusBar == "URGENT: Alert key compromised, upgrade required"
+ ))
+ return false;
+ }
+
CRITICAL_BLOCK(cs_mapAlerts)
{
// Cancel previous alerts
@@ -2780,13 +2802,26 @@ 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());
- CRITICAL_BLOCK(cs_vNodes)
- BOOST_FOREACH(CNode* pnode, vNodes)
- alert.RelayTo(pnode);
+ if (alert.ProcessAlert())
+ {
+ // Relay
+ pfrom->setKnown.insert(alertHash);
+ CRITICAL_BLOCK(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 6f2a08422e..99b55528ae 100644
--- a/src/main.h
+++ b/src/main.h
@@ -26,7 +26,7 @@ class CInv;
class CRequestTracker;
class CNode;
-static const int CLIENT_VERSION = 60009;
+static const int CLIENT_VERSION = 60010;
static const bool VERSION_IS_BETA = true;
extern const std::string CLIENT_NAME;
@@ -1565,7 +1565,7 @@ public:
uint256 GetHash() const
{
- return SerializeHash(*this);
+ return Hash(this->vchMsg.begin(), this->vchMsg.end());
}
bool IsInEffect() const