mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Don't allow a SerializerIterator to bind to a temporary Serializer. This was causing a bunch
of deserialization bugs.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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; }
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user