aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2018-11-28 15:57:47 -0500
committerMarcoFalke <falke.marco@gmail.com>2018-11-28 15:58:18 -0500
commit9f556622c57d3f7a0fdc8e3807fd798ee4b5a2fe (patch)
tree6d1bce64f12a47f4a301c7e63b0904a31814eadf /src/test
parent5150accdd2a7c7f0edf964d56bd7d34b5f740cdc (diff)
parent542651cfb408d10e6eaaa24ad985c95e51f88f75 (diff)
downloadbitcoin-9f556622c57d3f7a0fdc8e3807fd798ee4b5a2fe.tar.xz
Merge #14328: [0.17] Backports
542651cfb4 travis: Remove deprecated sudo (MarcoFalke) ec71f06a8d build: Add bitcoin-tx.exe into Windows installer (Chun Kuan Lee) 7edebedef1 build: Remove illegal spacing in darwin.mk (Jon Layton) fb9ad043f8 Fix listreceivedbyaddress not taking address as a string (Eric Scrivner) 91fa15aaeb wallet: Avoid potential use of unitialized value bnb_used in CWallet::CreateTransaction(...) (practicalswift) 96f15e8bb3 Tests: Fix a comment (fridokus) 60f7a97930 qa: Add test to ensure node can generate all help texts at runtime (MarcoFalke) 2f9fd29321 disallow oversized CBlockHeaderAndShortTxIDs (Kaz Wesley) 5331ad0506 fix a deserialization overflow edge case (Kaz Wesley) 94065024c7 add a test demonstrating an overflow in a deserialization edge case (Kaz Wesley) 85aacc41ba Add autogen.sh in ARM Cross-compilation (Walter) bb90695551 [wallet] Ensure wallet is unlocked before signing (gustavonalle) Pull request description: Tree-SHA512: d82813134e5fc5437fe690127a4701d7ba66bf27799d7ecb1fbc2cc4dd81b6b3f708c1f314b725e8a3a6525ffa388299e277157f784f762256e01afb24822b25
Diffstat (limited to 'src/test')
-rw-r--r--src/test/blockencodings_tests.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/test/blockencodings_tests.cpp b/src/test/blockencodings_tests.cpp
index d2c7c8cb1d..df62c5ac92 100644
--- a/src/test/blockencodings_tests.cpp
+++ b/src/test/blockencodings_tests.cpp
@@ -344,4 +344,49 @@ BOOST_AUTO_TEST_CASE(TransactionsRequestSerializationTest) {
BOOST_CHECK_EQUAL(req1.indexes[3], req2.indexes[3]);
}
+BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationMaxTest) {
+ // Check that the highest legal index is decoded correctly
+ BlockTransactionsRequest req0;
+ req0.blockhash = InsecureRand256();
+ req0.indexes.resize(1);
+ req0.indexes[0] = 0xffff;
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << req0;
+
+ BlockTransactionsRequest req1;
+ stream >> req1;
+ BOOST_CHECK_EQUAL(req0.indexes.size(), req1.indexes.size());
+ BOOST_CHECK_EQUAL(req0.indexes[0], req1.indexes[0]);
+}
+
+BOOST_AUTO_TEST_CASE(TransactionsRequestDeserializationOverflowTest) {
+ // Any set of index deltas that starts with N values that sum to (0x10000 - N)
+ // causes the edge-case overflow that was originally not checked for. Such
+ // a request cannot be created by serializing a real BlockTransactionsRequest
+ // due to the overflow, so here we'll serialize from raw deltas.
+ BlockTransactionsRequest req0;
+ req0.blockhash = InsecureRand256();
+ req0.indexes.resize(3);
+ req0.indexes[0] = 0x7000;
+ req0.indexes[1] = 0x10000 - 0x7000 - 2;
+ req0.indexes[2] = 0;
+ CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
+ stream << req0.blockhash;
+ WriteCompactSize(stream, req0.indexes.size());
+ WriteCompactSize(stream, req0.indexes[0]);
+ WriteCompactSize(stream, req0.indexes[1]);
+ WriteCompactSize(stream, req0.indexes[2]);
+
+ BlockTransactionsRequest req1;
+ try {
+ stream >> req1;
+ // before patch: deserialize above succeeds and this check fails, demonstrating the overflow
+ BOOST_CHECK(req1.indexes[1] < req1.indexes[2]);
+ // this shouldn't be reachable before or after patch
+ BOOST_CHECK(0);
+ } catch(std::ios_base::failure &) {
+ // deserialize should fail
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()