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);

View File

@@ -112,7 +112,7 @@ public:
// ledger signature operations
void addRaw(Serializer &s) const;
void setRaw(const Serializer& s);
void setRaw(Serializer& s);
uint256 getHash();
const uint256& getParentHash() const { return mParentHash; }

View File

@@ -98,8 +98,7 @@ public:
std::vector<unsigned char> getData() const { return mData.getData(); }
const std::vector<unsigned char>& peekData() const { return mData.peekData(); }
Serializer& peekSerializer() { return mData; }
void addRaw(Serializer &s) { s.addRaw(mData); }
void addRaw(std::vector<unsigned char>& s) { s.insert(s.end(), mData.begin(), mData.end()); }
void addRaw(std::vector<unsigned char>& s) const { s.insert(s.end(), mData.begin(), mData.end()); }
void updateData(const std::vector<unsigned char>& data) { mData=data; }

View File

@@ -404,12 +404,12 @@ void SHAMapTreeNode::addRaw(Serializer& s, SHANodeFormat format)
if (format == snfPREFIX)
{
s.add32(sHP_LeafNode);
mItem->addRaw(s);
s.addRaw(mItem->peekData());
s.add256(mItem->getTag());
}
else
{
mItem->addRaw(s);
s.addRaw(mItem->peekData());
s.add256(mItem->getTag());
s.add8(1);
}
@@ -419,11 +419,11 @@ void SHAMapTreeNode::addRaw(Serializer& s, SHANodeFormat format)
if (format == snfPREFIX)
{
s.add32(sHP_TransactionID);
mItem->addRaw(s);
s.addRaw(mItem->peekData());
}
else
{
mItem->addRaw(s);
s.addRaw(mItem->peekData());
s.add8(0);
}
}
@@ -432,12 +432,12 @@ void SHAMapTreeNode::addRaw(Serializer& s, SHANodeFormat format)
if (format == snfPREFIX)
{
s.add32(sHP_TransactionNode);
mItem->addRaw(s);
s.addRaw(mItem->peekData());
s.add256(mItem->getTag());
}
else
{
mItem->addRaw(s);
s.addRaw(mItem->peekData());
s.add256(mItem->getTag());
s.add8(4);
}

View File

@@ -21,7 +21,7 @@ SerializedLedgerEntry::SerializedLedgerEntry(SerializerIterator& sit, const uint
SerializedLedgerEntry::SerializedLedgerEntry(const Serializer& s, const uint256& index)
: STObject(sfLedgerEntry), mIndex(index)
{
SerializerIterator sit(s);
SerializerIterator sit(const_cast<Serializer&>(s)); // we know 's' isn't going away
set(sit);
uint16 type = getFieldU16(sfLedgerEntryType);

View File

@@ -143,7 +143,9 @@ protected:
int mPos;
public:
SerializerIterator(const Serializer& s) : mSerializer(s), mPos(0) { ; }
// Reference is not const because we don't want to bind to a temporary
SerializerIterator(Serializer& s) : mSerializer(s), mPos(0) { ; }
void reset(void) { mPos = 0; }
void setPos(int p) { mPos = p; }