mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-05 09:46:53 +00:00
fix: Skip deleted book directories and non-root modifications in ValidBookDirectory invariant (#7312)
This commit is contained in:
@@ -2137,6 +2137,70 @@ class Invariants_test : public beast::unit_test::Suite
|
||||
BEAST_EXPECT(
|
||||
invariant.finalize(makeOfferCreateTx(), tesSUCCESS, XRPAmount{}, view, jlog));
|
||||
}
|
||||
|
||||
// A bad root is rejected when added, ignored when a legacy bad root is
|
||||
// modified without changing sfRootIndex or deleted, and checked when a
|
||||
// modified directory changes sfRootIndex.
|
||||
{
|
||||
Env env{*this, defaultAmendments()};
|
||||
Account const a1{"A1"};
|
||||
env.fund(XRP(1000), a1);
|
||||
env.close();
|
||||
|
||||
OpenView view{*env.current()};
|
||||
auto const directoryQuality = STAmount::kURateOne;
|
||||
auto const rootDir = getBookRootKey(a1, directoryQuality);
|
||||
auto const missingRootDir = getBookRootKey(a1, directoryQuality + 1);
|
||||
auto const badRoot = makeRootPage(rootDir, directoryQuality + 1);
|
||||
view.rawInsert(badRoot);
|
||||
|
||||
test::StreamSink sink{beast::Severity::Warning};
|
||||
beast::Journal const jlog{sink};
|
||||
|
||||
{
|
||||
// add
|
||||
ValidBookDirectory invariant;
|
||||
invariant.visitEntry(false, nullptr, badRoot);
|
||||
|
||||
BEAST_EXPECT(
|
||||
!invariant.finalize(makeOfferCreateTx(), tesSUCCESS, XRPAmount{}, view, jlog));
|
||||
}
|
||||
{
|
||||
// modify (without changing the sfRootIndex)
|
||||
ValidBookDirectory invariant;
|
||||
invariant.visitEntry(false, badRoot, badRoot);
|
||||
|
||||
BEAST_EXPECT(
|
||||
invariant.finalize(makeOfferCreateTx(), tesSUCCESS, XRPAmount{}, view, jlog));
|
||||
}
|
||||
{
|
||||
// modify (changing sfRootIndex to a missing root)
|
||||
auto const childBefore = makeChildPage(rootDir);
|
||||
auto const childAfter = std::make_shared<SLE>(*childBefore, childBefore->key());
|
||||
childAfter->setFieldH256(sfRootIndex, missingRootDir.key);
|
||||
|
||||
ValidBookDirectory invariant;
|
||||
invariant.visitEntry(false, childBefore, childAfter);
|
||||
|
||||
test::StreamSink missingRootSink{beast::Severity::Warning};
|
||||
beast::Journal const missingRootJlog{missingRootSink};
|
||||
BEAST_EXPECT(!invariant.finalize(
|
||||
makeOfferCreateTx(), tesSUCCESS, XRPAmount{}, view, missingRootJlog));
|
||||
BEAST_EXPECT(
|
||||
missingRootSink.messages().str().find("book directory root missing") !=
|
||||
std::string::npos);
|
||||
}
|
||||
{
|
||||
// delete
|
||||
view.rawErase(badRoot);
|
||||
BEAST_EXPECT(!view.exists(rootDir));
|
||||
|
||||
ValidBookDirectory invariant;
|
||||
invariant.visitEntry(true, badRoot, badRoot);
|
||||
BEAST_EXPECT(
|
||||
invariant.finalize(makeOfferCreateTx(), tesSUCCESS, XRPAmount{}, view, jlog));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Keylet
|
||||
|
||||
Reference in New Issue
Block a user