diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index 1934225d16..97c1fb11fa 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -695,6 +695,15 @@ public: if (isCurrent) mLedgerHistory.addLedger(ledger, true); + { + // Check the SQL database's entry for the sequence before this ledger, + // if it's not this ledger's parent, invalidate it + uint256 prevHash = Ledger::getHashByIndex (ledger->info().seq - 1); + if (prevHash.isNonZero () && (prevHash != ledger->info().parentHash)) + clearLedger (ledger->info().seq - 1); + } + + ledger->pendSaveValidated (isSynchronous, isCurrent); { diff --git a/src/ripple/rpc/impl/LookupLedger.cpp b/src/ripple/rpc/impl/LookupLedger.cpp index 4a036d6ac3..68330ddb63 100644 --- a/src/ripple/rpc/impl/LookupLedger.cpp +++ b/src/ripple/rpc/impl/LookupLedger.cpp @@ -152,8 +152,21 @@ bool isValidated (LedgerMaster& ledgerMaster, ReadView const& ledger) // comes before the last validated ledger (and thus has been // validated). auto hash = ledgerMaster.walkHashBySeq (seq); + if (ledger.info().hash != hash) + { + // This ledger's hash is not the hash of the validated ledger + if (hash.isNonZero ()) + { + uint256 valHash = Ledger::getHashByIndex (seq); + if (valHash == ledger.info().hash) + { + // SQL database doesn't match ledger chain + ledgerMaster.clearLedger (seq); + } + } return false; + } } catch (SHAMapMissingNode const&) {