Skip to content

Commit

Permalink
Merge pull request #5913
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
laanwj committed Aug 5, 2015
2 parents c384800 + 5922b67 commit a0625b8
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 8 deletions.
8 changes: 4 additions & 4 deletions src/consensus/validation.h
Expand Up @@ -28,12 +28,12 @@ class CValidationState {
} 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;
Expand All @@ -45,7 +45,7 @@ class CValidationState {
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) {
Expand Down Expand Up @@ -73,7 +73,7 @@ class CValidationState {
bool CorruptionPossible() const {
return corruptionPossible;
}
unsigned char GetRejectCode() const { return chRejectCode; }
unsigned int GetRejectCode() const { return chRejectCode; }
std::string GetRejectReason() const { return strRejectReason; }
};

Expand Down
10 changes: 6 additions & 4 deletions src/main.cpp
Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/main.h
Expand Up @@ -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

0 comments on commit a0625b8

Please sign in to comment.