diff options
author | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-30 00:51:25 -0700 |
---|---|---|
committer | Gavin Andresen <gavinandresen@gmail.com> | 2013-10-30 00:51:25 -0700 |
commit | 951ed190fb8c609db2247eba59665a338ea824a9 (patch) | |
tree | d1354bb9e034d5d1fc5afdca9958f0c31af19571 /src/net.cpp | |
parent | e13934c94eb6e95c21e04b92c4b0775b2bded67e (diff) | |
parent | 9038b18f4655a5b8ad119d768decd1c693ebd7dd (diff) |
Merge pull request #3173 from gavinandresen/fuzzmessages
-fuzzmessagestest=N : randomly corrupt 1-of-N sent messages
Diffstat (limited to 'src/net.cpp')
-rw-r--r-- | src/net.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/net.cpp b/src/net.cpp index d223b3999e..de8543da59 100644 --- a/src/net.cpp +++ b/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); +} |