From 0075f36bbcfafdb27ed36f52154aa50e6dbf24cd Mon Sep 17 00:00:00 2001 From: David Schwartz Date: Fri, 9 May 2014 12:05:40 -0700 Subject: [PATCH] At level 64, only leaves are allowed --- src/ripple_app/ledger/InboundLedger.cpp | 12 ++++++++++-- src/ripple_app/shamap/SHAMapSync.cpp | 7 +++++++ src/ripple_app/shamap/SHAMapTreeNode.h | 5 +++++ src/ripple_app/tx/TransactionAcquire.cpp | 5 +++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/ripple_app/ledger/InboundLedger.cpp b/src/ripple_app/ledger/InboundLedger.cpp index 657255442..b35285a86 100644 --- a/src/ripple_app/ledger/InboundLedger.cpp +++ b/src/ripple_app/ledger/InboundLedger.cpp @@ -539,7 +539,11 @@ void InboundLedger::trigger (Peer::ptr const& peer) { assert (mLedger); - if (mLedger->peekAccountStateMap ()->getHash ().isZero ()) + if (!mLedger->peekAccountStateMap ()->isValid ()) + { + mFailed = true; + } + else if (mLedger->peekAccountStateMap ()->getHash ().isZero ()) { // we need the root node tmGL.set_itype (protocol::liAS_NODE); @@ -614,7 +618,11 @@ void InboundLedger::trigger (Peer::ptr const& peer) { assert (mLedger); - if (mLedger->peekTransactionMap ()->getHash ().isZero ()) + if (!mLedger->peekTransactionMap ()->isValid ()) + { + mFailed = true; + } + else if (mLedger->peekTransactionMap ()->getHash ().isZero ()) { // we need the root node tmGL.set_itype (protocol::liTX_NODE); diff --git a/src/ripple_app/shamap/SHAMapSync.cpp b/src/ripple_app/shamap/SHAMapSync.cpp index 15b87f4c1..fba8c407b 100644 --- a/src/ripple_app/shamap/SHAMapSync.cpp +++ b/src/ripple_app/shamap/SHAMapSync.cpp @@ -472,6 +472,13 @@ SHAMapAddNode SHAMap::addKnownNode (const SHAMapNode& node, Blob const& rawNode, canonicalize (iNode->getChildHash (branch), newNode); + if (!iNode->isInBounds ()) + { + // Map is provably invalid + mState = smsInvalid; + return SHAMapAddNode::useful (); + } + if (mTNByID.canonicalize(node, &newNode) && filter) { Serializer s; diff --git a/src/ripple_app/shamap/SHAMapTreeNode.h b/src/ripple_app/shamap/SHAMapTreeNode.h index 82a081f77..2e5119c94 100644 --- a/src/ripple_app/shamap/SHAMapTreeNode.h +++ b/src/ripple_app/shamap/SHAMapTreeNode.h @@ -99,6 +99,11 @@ public: { return mType == tnINNER; } + bool isInBounds () const + { + // Nodes at depth 64 must be leaves + return (!isInner() || (getDepth() < 64)); + } bool isValid () const { return mType != tnERROR; diff --git a/src/ripple_app/tx/TransactionAcquire.cpp b/src/ripple_app/tx/TransactionAcquire.cpp index 6a6739dcf..0755ff20f 100644 --- a/src/ripple_app/tx/TransactionAcquire.cpp +++ b/src/ripple_app/tx/TransactionAcquire.cpp @@ -163,6 +163,11 @@ void TransactionAcquire::trigger (Peer::ptr const& peer) * (tmGL.add_nodeids ()) = SHAMapNode ().getRawString (); sendRequest (tmGL, peer); } + else if (!mMap->isValid ()) + { + mFailed = true; + done (); + } else { std::vector nodeIDs;