net: parse reject earlier
Prior to this change, all messages were ignored until a VERSION message was received, as well as possibly incurring a ban score. Since REJECT messages can be sent at any time (including as a response to a bad VERSION message), make sure to always parse them. Moving this parsing up keeps it from being caught in the if (pfrom->nVersion == 0) check below.
This commit is contained in:
parent
c45b9fb54c
commit
8502e7acbe
1 changed files with 24 additions and 26 deletions
|
@ -1190,8 +1190,31 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strCommand == NetMsgType::REJECT)
|
||||||
|
{
|
||||||
|
if (fDebug) {
|
||||||
|
try {
|
||||||
|
std::string strMsg; unsigned char ccode; std::string strReason;
|
||||||
|
vRecv >> LIMITED_STRING(strMsg, CMessageHeader::COMMAND_SIZE) >> ccode >> LIMITED_STRING(strReason, MAX_REJECT_MESSAGE_LENGTH);
|
||||||
|
|
||||||
if (strCommand == NetMsgType::VERSION)
|
std::ostringstream ss;
|
||||||
|
ss << strMsg << " code " << itostr(ccode) << ": " << strReason;
|
||||||
|
|
||||||
|
if (strMsg == NetMsgType::BLOCK || strMsg == NetMsgType::TX)
|
||||||
|
{
|
||||||
|
uint256 hash;
|
||||||
|
vRecv >> hash;
|
||||||
|
ss << ": hash " << hash.ToString();
|
||||||
|
}
|
||||||
|
LogPrint("net", "Reject %s\n", SanitizeString(ss.str()));
|
||||||
|
} catch (const std::ios_base::failure&) {
|
||||||
|
// Avoid feedback loops by preventing reject messages from triggering a new reject message.
|
||||||
|
LogPrint("net", "Unparseable reject message received\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (strCommand == NetMsgType::VERSION)
|
||||||
{
|
{
|
||||||
// Each connection can only send one version message
|
// Each connection can only send one version message
|
||||||
if (pfrom->nVersion != 0)
|
if (pfrom->nVersion != 0)
|
||||||
|
@ -2544,31 +2567,6 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
||||||
pfrom->fRelayTxes = true;
|
pfrom->fRelayTxes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
else if (strCommand == NetMsgType::REJECT)
|
|
||||||
{
|
|
||||||
if (fDebug) {
|
|
||||||
try {
|
|
||||||
std::string strMsg; unsigned char ccode; std::string strReason;
|
|
||||||
vRecv >> LIMITED_STRING(strMsg, CMessageHeader::COMMAND_SIZE) >> ccode >> LIMITED_STRING(strReason, MAX_REJECT_MESSAGE_LENGTH);
|
|
||||||
|
|
||||||
std::ostringstream ss;
|
|
||||||
ss << strMsg << " code " << itostr(ccode) << ": " << strReason;
|
|
||||||
|
|
||||||
if (strMsg == NetMsgType::BLOCK || strMsg == NetMsgType::TX)
|
|
||||||
{
|
|
||||||
uint256 hash;
|
|
||||||
vRecv >> hash;
|
|
||||||
ss << ": hash " << hash.ToString();
|
|
||||||
}
|
|
||||||
LogPrint("net", "Reject %s\n", SanitizeString(ss.str()));
|
|
||||||
} catch (const std::ios_base::failure&) {
|
|
||||||
// Avoid feedback loops by preventing reject messages from triggering a new reject message.
|
|
||||||
LogPrint("net", "Unparseable reject message received\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (strCommand == NetMsgType::FEEFILTER) {
|
else if (strCommand == NetMsgType::FEEFILTER) {
|
||||||
CAmount newFeeFilter = 0;
|
CAmount newFeeFilter = 0;
|
||||||
vRecv >> newFeeFilter;
|
vRecv >> newFeeFilter;
|
||||||
|
|
Loading…
Reference in a new issue