mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 06:28:31 +01:00
-fuzzmessagestest=N : randomly corrupt 1-of-N sent messages
I needed this to test the new "reject" p2p message, but it should be generally useful for fuzz-testing network message handling code.
This commit is contained in:
35
src/net.cpp
35
src/net.cpp
@@ -1894,3 +1894,38 @@ uint64 CNode::GetTotalBytesSent()
|
||||
LOCK(cs_totalBytesSent);
|
||||
return nTotalBytesSent;
|
||||
}
|
||||
|
||||
void CNode::Fuzz(int nChance)
|
||||
{
|
||||
if (!fSuccessfullyConnected) return; // Don't fuzz initial handshake
|
||||
if (GetRand(nChance) != 0) return; // Fuzz 1 of every nChance messages
|
||||
|
||||
switch (GetRand(3))
|
||||
{
|
||||
case 0:
|
||||
// xor a random byte with a random value:
|
||||
if (!ssSend.empty()) {
|
||||
CDataStream::size_type pos = GetRand(ssSend.size());
|
||||
ssSend[pos] ^= (unsigned char)(GetRand(256));
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
// delete a random byte:
|
||||
if (!ssSend.empty()) {
|
||||
CDataStream::size_type pos = GetRand(ssSend.size());
|
||||
ssSend.erase(ssSend.begin()+pos);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
// insert a random byte at a random position
|
||||
{
|
||||
CDataStream::size_type pos = GetRand(ssSend.size());
|
||||
char ch = (char)GetRand(256);
|
||||
ssSend.insert(ssSend.begin()+pos, ch);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// Chance of more than one change half the time:
|
||||
// (more changes exponentially less likely):
|
||||
Fuzz(2);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user