Don't allow a SerializerIterator to bind to a temporary Serializer. This was causing a bunch

of deserialization bugs.
This commit is contained in:
JoelKatz
2012-10-17 06:07:18 -07:00
parent a568f6ff26
commit 305b037f59
6 changed files with 18 additions and 15 deletions

View File

@@ -92,13 +92,15 @@ Ledger::Ledger(bool /* dummy */, Ledger& prevLedger) :
Ledger::Ledger(const std::vector<unsigned char>& rawLedger) :
mClosed(false), mValidHash(false), mAccepted(false), mImmutable(true)
{
setRaw(Serializer(rawLedger));
Serializer s(rawLedger);
setRaw(s);
}
Ledger::Ledger(const std::string& rawLedger) :
mClosed(false), mValidHash(false), mAccepted(false), mImmutable(true)
{
setRaw(Serializer(rawLedger));
Serializer s(rawLedger);
setRaw(s);
}
void Ledger::updateHash()
@@ -118,7 +120,7 @@ void Ledger::updateHash()
mValidHash = true;
}
void Ledger::setRaw(const Serializer &s)
void Ledger::setRaw(Serializer &s)
{
SerializerIterator sit(s);
mLedgerSeq = sit.get32();
@@ -311,7 +313,7 @@ bool Ledger::getTransaction(const uint256& txID, Transaction::pointer& txn, Tran
}
else if (type == SHAMapTreeNode::tnTRANSACTION_MD)
{ // in tree with metadata
SerializerIterator it(item->getData());
SerializerIterator it(item->peekSerializer());
txn = theApp->getMasterTransaction().fetch(txID, false);
if (!txn)
txn = Transaction::sharedTransaction(it.getVL(), true);