aboutsummaryrefslogtreecommitdiff
path: root/src/net.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2013-10-30 00:51:25 -0700
committerGavin Andresen <gavinandresen@gmail.com>2013-10-30 00:51:25 -0700
commit951ed190fb8c609db2247eba59665a338ea824a9 (patch)
treed1354bb9e034d5d1fc5afdca9958f0c31af19571 /src/net.cpp
parente13934c94eb6e95c21e04b92c4b0775b2bded67e (diff)
parent9038b18f4655a5b8ad119d768decd1c693ebd7dd (diff)
downloadbitcoin-951ed190fb8c609db2247eba59665a338ea824a9.tar.xz
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.cpp35
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);
+}