diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 704be83ef..11e2d2024 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -704,3 +704,65 @@ TEST(checktransaction_tests, OverwinteredContextualCreateTx) { // Revert to default UpdateNetworkUpgradeParameters(Consensus::UPGRADE_OVERWINTER, Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT); } + +// Test a v1 transaction which has a malformed header, perhaps modified in-flight +TEST(checktransaction_tests, BadTxReceivedOverNetwork) +{ + // First four bytes <01 00 00 00> have been modified to be (-4 as an int32) + std::string goodPrefix = "01000000"; + std::string badPrefix = "fcffffff"; + std::string hexTx = "0176c6541939b95f8d8b7779a77a0863b2a0267e281a050148326f0ea07c3608fb000000006a47304402207c68117a6263486281af0cc5d3bee6db565b6dce19ffacc4cb361906eece82f8022007f604382dee2c1fde41c4e6e7c1ae36cfa28b5b27350c4bfaa27f555529eace01210307ff9bef60f2ac4ceb1169a9f7d2c773d6c7f4ab6699e1e5ebc2e0c6d291c733feffffff02c0d45407000000001976a9145eaaf6718517ec8a291c6e64b16183292e7011f788ac5ef44534000000001976a91485e12fb9967c96759eae1c6b1e9c07ce977b638788acbe000000"; + + // Good v1 tx + { + std::vector txData(ParseHex(goodPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + ssData >> tx; + EXPECT_EQ(tx.nVersion, 1); + EXPECT_EQ(tx.fOverwintered, false); + } + + // Good v1 mutable tx + { + std::vector txData(ParseHex(goodPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + CMutableTransaction mtx; + ssData >> mtx; + EXPECT_EQ(mtx.nVersion, 1); + } + + // Bad tx + { + std::vector txData(ParseHex(badPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + try { + CTransaction tx; + ssData >> tx; + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format'"; + } + catch(std::ios_base::failure & err) { + EXPECT_THAT(err.what(), testing::HasSubstr(std::string("Unknown transaction format"))); + } + catch(...) { + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format', got some other exception"; + } + } + + // Bad mutable tx + { + std::vector txData(ParseHex(badPrefix + hexTx )); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + try { + CMutableTransaction mtx; + ssData >> mtx; + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format'"; + } + catch(std::ios_base::failure & err) { + EXPECT_THAT(err.what(), testing::HasSubstr(std::string("Unknown transaction format"))); + } + catch(...) { + FAIL() << "Expected std::ios_base::failure 'Unknown transaction format', got some other exception"; + } + } +} \ No newline at end of file