mirror of
https://github.com/XRPLF/rippled.git
synced 2026-06-04 01:06:48 +00:00
fix ReserveCount Inflation via Co-Signed + Pre-Funded Interaction
fix #6864
This commit is contained in:
@@ -362,7 +362,7 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx)
|
||||
}
|
||||
|
||||
TER
|
||||
adjustReserveCount(
|
||||
reduceReserveCount(
|
||||
ApplyView& view,
|
||||
AccountID const& account,
|
||||
AccountID const& sponsor,
|
||||
@@ -370,6 +370,9 @@ adjustReserveCount(
|
||||
{
|
||||
if (delta == 0)
|
||||
return tesSUCCESS;
|
||||
if (delta > 0)
|
||||
return tefINTERNAL; // LCOV_EXCL_LINE
|
||||
|
||||
auto const sponsorKeylet = keylet::sponsor(sponsor, account);
|
||||
auto const sponsorSle = view.peek(sponsorKeylet);
|
||||
if (!sponsorSle)
|
||||
@@ -472,7 +475,7 @@ SponsorshipTransfer::doApply()
|
||||
if (!hasSignature)
|
||||
{
|
||||
// use ReserveCount for pre-funded sponsoring
|
||||
if (auto const ter = adjustReserveCount(
|
||||
if (auto const ter = reduceReserveCount(
|
||||
view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta);
|
||||
!isTesSuccess(ter))
|
||||
return ter;
|
||||
@@ -509,22 +512,11 @@ SponsorshipTransfer::doApply()
|
||||
if (!hasSignature)
|
||||
{
|
||||
// use ReserveCount for pre-funded sponsoring
|
||||
if (auto const ter = adjustReserveCount(
|
||||
if (auto const ter = reduceReserveCount(
|
||||
view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta);
|
||||
!isTesSuccess(ter))
|
||||
return ter;
|
||||
}
|
||||
|
||||
// payback the reserve count if ltSponsorship exists
|
||||
if (auto const sponsorSle =
|
||||
view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID));
|
||||
sponsorSle)
|
||||
{
|
||||
if (auto const ter = adjustReserveCount(
|
||||
view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta);
|
||||
!isTesSuccess(ter))
|
||||
return ter;
|
||||
}
|
||||
}
|
||||
else if ((flags & tfSponsorshipEnd) != 0u)
|
||||
{
|
||||
@@ -543,17 +535,6 @@ SponsorshipTransfer::doApply()
|
||||
setSponsorFieldU32(oldSponsorSle, sfSponsoringOwnerCount, -ownerCountDelta);
|
||||
view().update(oldSponsorSle);
|
||||
|
||||
// payback the reserve count if ltSponsorship exists
|
||||
if (auto const sponsorSle =
|
||||
view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID));
|
||||
sponsorSle)
|
||||
{
|
||||
if (auto const ter = adjustReserveCount(
|
||||
view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta);
|
||||
!isTesSuccess(ter))
|
||||
return ter;
|
||||
}
|
||||
|
||||
// remove sponsor from object
|
||||
objSle->makeFieldAbsent(sponsorField);
|
||||
view().update(objSle);
|
||||
|
||||
@@ -1222,7 +1222,7 @@ public:
|
||||
BEAST_EXPECT(checkSle->isFieldPresent(sfSponsor));
|
||||
BEAST_EXPECT(checkSle->getAccountID(sfSponsor) == sponsor2.id());
|
||||
sponsor1Sle = env.le(keylet::sponsor(sponsor1, alice));
|
||||
BEAST_EXPECT(sponsor1Sle->getFieldU32(sfReserveCount) == 100); // paybacked
|
||||
BEAST_EXPECT(sponsor1Sle->getFieldU32(sfReserveCount) == 99);
|
||||
auto sponsor2Sle = env.le(keylet::sponsor(sponsor2, alice));
|
||||
BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 99);
|
||||
|
||||
@@ -1245,7 +1245,7 @@ public:
|
||||
checkSle = env.le(keylet::unchecked(checkId));
|
||||
BEAST_EXPECT(!checkSle->isFieldPresent(sfSponsor));
|
||||
sponsor2Sle = env.le(keylet::sponsor(sponsor2, alice));
|
||||
BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 100); // paybacked
|
||||
BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 99);
|
||||
}
|
||||
|
||||
{
|
||||
@@ -1332,7 +1332,7 @@ public:
|
||||
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 0);
|
||||
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 0);
|
||||
BEAST_EXPECT(
|
||||
env.le(keylet::sponsor(sponsor, alice))->getFieldU32(sfReserveCount) == 101);
|
||||
env.le(keylet::sponsor(sponsor, alice))->getFieldU32(sfReserveCount) == 100);
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user