aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2015-08-05 19:12:46 +0200
committerWladimir J. van der Laan <laanwj@gmail.com>2015-08-05 19:12:48 +0200
commita0625b8085aa379ac5f7bdca6f2cbf3cbb4a5d0a (patch)
treeefb535486e2d574f13049963f3a25c0757a5ebf8 /src
parentc3848000277d5ab6b5f5faecb1d21b89374ef999 (diff)
parent5922b6774e352e802ca9a347cc224cfebf1a6a7d (diff)
downloadbitcoin-a0625b8085aa379ac5f7bdca6f2cbf3cbb4a5d0a.tar.xz
Merge pull request #5913
5922b67 Add assertion and cast before sending reject code (Wladimir J. van der Laan) a651403 Add absurdly high fee message to validation state (for RPC propagation) (Shaul Kfir)
Diffstat (limited to 'src')
-rw-r--r--src/consensus/validation.h8
-rw-r--r--src/main.cpp10
-rw-r--r--src/main.h3
3 files changed, 13 insertions, 8 deletions
diff --git a/src/consensus/validation.h b/src/consensus/validation.h
index a97d983a31..719e090a42 100644
--- a/src/consensus/validation.h
+++ b/src/consensus/validation.h
@@ -28,12 +28,12 @@ private:
} mode;
int nDoS;
std::string strRejectReason;
- unsigned char chRejectCode;
+ unsigned int chRejectCode;
bool corruptionPossible;
public:
CValidationState() : mode(MODE_VALID), nDoS(0), chRejectCode(0), corruptionPossible(false) {}
bool DoS(int level, bool ret = false,
- unsigned char chRejectCodeIn=0, std::string strRejectReasonIn="",
+ unsigned int chRejectCodeIn=0, std::string strRejectReasonIn="",
bool corruptionIn=false) {
chRejectCode = chRejectCodeIn;
strRejectReason = strRejectReasonIn;
@@ -45,7 +45,7 @@ public:
return ret;
}
bool Invalid(bool ret = false,
- unsigned char _chRejectCode=0, std::string _strRejectReason="") {
+ unsigned int _chRejectCode=0, std::string _strRejectReason="") {
return DoS(0, ret, _chRejectCode, _strRejectReason);
}
bool Error(const std::string& strRejectReasonIn) {
@@ -73,7 +73,7 @@ public:
bool CorruptionPossible() const {
return corruptionPossible;
}
- unsigned char GetRejectCode() const { return chRejectCode; }
+ unsigned int GetRejectCode() const { return chRejectCode; }
std::string GetRejectReason() const { return strRejectReason; }
};
diff --git a/src/main.cpp b/src/main.cpp
index 52d543c117..79cc606856 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -927,9 +927,10 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
}
if (fRejectAbsurdFee && nFees > ::minRelayTxFee.GetFee(nSize) * 10000)
- return error("AcceptToMemoryPool: absurdly high fees %s, %d > %d",
- hash.ToString(),
- nFees, ::minRelayTxFee.GetFee(nSize) * 10000);
+ return state.Invalid(error("AcceptToMemoryPool: absurdly high fees %s, %d > %d",
+ hash.ToString(),
+ nFees, ::minRelayTxFee.GetFee(nSize) * 10000),
+ REJECT_HIGHFEE, "absurdly-high-fee");
// Check against previous transactions
// This is done last to help prevent CPU exhaustion denial-of-service attacks.
@@ -1238,7 +1239,8 @@ void static InvalidBlockFound(CBlockIndex *pindex, const CValidationState &state
if (state.IsInvalid(nDoS)) {
std::map<uint256, NodeId>::iterator it = mapBlockSource.find(pindex->GetBlockHash());
if (it != mapBlockSource.end() && State(it->second)) {
- CBlockReject reject = {state.GetRejectCode(), state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), pindex->GetBlockHash()};
+ assert(state.GetRejectCode() < 0x100);
+ CBlockReject reject = {(unsigned char)state.GetRejectCode(), state.GetRejectReason().substr(0, MAX_REJECT_MESSAGE_LENGTH), pindex->GetBlockHash()};
State(it->second)->rejects.push_back(reject);
if (nDoS > 0)
Misbehaving(it->second, nDoS);
diff --git a/src/main.h b/src/main.h
index 96ad54cda6..eec7e6fa59 100644
--- a/src/main.h
+++ b/src/main.h
@@ -455,4 +455,7 @@ extern CBlockTreeDB *pblocktree;
*/
int GetSpendHeight(const CCoinsViewCache& inputs);
+/** local "reject" message codes for RPC which can not be triggered by p2p trasactions */
+static const unsigned int REJECT_HIGHFEE = 0x100;
+
#endif // BITCOIN_MAIN_H