diff --git a/src/primitives/transaction.h b/src/primitives/transaction.h index 047b10139a..e2307a7e09 100644 --- a/src/primitives/transaction.h +++ b/src/primitives/transaction.h @@ -351,6 +351,10 @@ inline void UnserializeTransaction(TxType& tx, Stream& s) { const_cast(&tx.witness)->vtxinwit.resize(tx.vin.size()); const_cast(&tx.witness)->vtxoutwit.resize(tx.vout.size()); s >> tx.witness; + if (!tx.HasWitness()) { + /* It's illegal to encode witnesses when all witness stacks are empty. */ + throw std::ios_base::failure("Superfluous witness record"); + } } } else { const bool fAllowWitness = !(s.GetVersion() & SERIALIZE_TRANSACTION_NO_WITNESS); @@ -381,6 +385,10 @@ inline void UnserializeTransaction(TxType& tx, Stream& s) { s >> tx.witness.vtxinwit[i].m_pegin_witness.stack; } } + if (!tx.HasWitness()) { + /* It's illegal to encode witnesses when all witness stacks are empty. */ + throw std::ios_base::failure("Superfluous witness record"); + } } s >> tx.nLockTime; }