Truncate oversize 'tx' messages before relaying/storing.
Fixes a memory exhaustion attack on low-memory peers.
This commit is contained in:
parent
2e01ec3207
commit
c40a5aaaf4
10
src/main.cpp
10
src/main.cpp
@ -3567,6 +3567,16 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
|||||||
CInv inv(MSG_TX, tx.GetHash());
|
CInv inv(MSG_TX, tx.GetHash());
|
||||||
pfrom->AddInventoryKnown(inv);
|
pfrom->AddInventoryKnown(inv);
|
||||||
|
|
||||||
|
// Truncate messages to the size of the tx in them
|
||||||
|
unsigned int nSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
unsigned int oldSize = vMsg.size();
|
||||||
|
if (nSize < oldSize) {
|
||||||
|
vMsg.resize(nSize);
|
||||||
|
printf("truncating oversized TX %s (%u -> %u)\n",
|
||||||
|
tx.GetHash().ToString().c_str(),
|
||||||
|
oldSize, nSize);
|
||||||
|
}
|
||||||
|
|
||||||
bool fMissingInputs = false;
|
bool fMissingInputs = false;
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
if (mempool.accept(state, tx, true, &fMissingInputs))
|
if (mempool.accept(state, tx, true, &fMissingInputs))
|
||||||
|
Loading…
Reference in New Issue
Block a user