From 305b037f595825b4c7d0e0dcbbdb20d3969f1954 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 17 Oct 2012 06:07:18 -0700 Subject: [PATCH] Don't allow a SerializerIterator to bind to a temporary Serializer. This was causing a bunch of deserialization bugs. --- src/Ledger.cpp | 10 ++++++---- src/Ledger.h | 2 +- src/SHAMap.h | 3 +-- src/SHAMapNodes.cpp | 12 ++++++------ src/SerializedLedger.cpp | 2 +- src/Serializer.h | 4 +++- 6 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/Ledger.cpp b/src/Ledger.cpp index 697e0eb1e2..dd67647b51 100644 --- a/src/Ledger.cpp +++ b/src/Ledger.cpp @@ -92,13 +92,15 @@ Ledger::Ledger(bool /* dummy */, Ledger& prevLedger) : Ledger::Ledger(const std::vector& 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); diff --git a/src/Ledger.h b/src/Ledger.h index aa9cc9f142..2b03b88ea9 100644 --- a/src/Ledger.h +++ b/src/Ledger.h @@ -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; } diff --git a/src/SHAMap.h b/src/SHAMap.h index a30c1f8808..2518669b27 100644 --- a/src/SHAMap.h +++ b/src/SHAMap.h @@ -98,8 +98,7 @@ public: std::vector getData() const { return mData.getData(); } const std::vector& peekData() const { return mData.peekData(); } Serializer& peekSerializer() { return mData; } - void addRaw(Serializer &s) { s.addRaw(mData); } - void addRaw(std::vector& s) { s.insert(s.end(), mData.begin(), mData.end()); } + void addRaw(std::vector& s) const { s.insert(s.end(), mData.begin(), mData.end()); } void updateData(const std::vector& data) { mData=data; } diff --git a/src/SHAMapNodes.cpp b/src/SHAMapNodes.cpp index 2eaa0ed806..b14516813e 100644 --- a/src/SHAMapNodes.cpp +++ b/src/SHAMapNodes.cpp @@ -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); } diff --git a/src/SerializedLedger.cpp b/src/SerializedLedger.cpp index 1e29a99c22..4ffecf2311 100644 --- a/src/SerializedLedger.cpp +++ b/src/SerializedLedger.cpp @@ -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(s)); // we know 's' isn't going away set(sit); uint16 type = getFieldU16(sfLedgerEntryType); diff --git a/src/Serializer.h b/src/Serializer.h index 8666efe4c3..93add9d61d 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -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; }