Fix the flag processing of NFTokenModify (#5246)

Adds checks for invalid flags.
This commit is contained in:
tequ
2025-01-17 00:37:52 +09:00
committed by GitHub
parent ff8b9aa439
commit 9e4a7d5871
3 changed files with 23 additions and 2 deletions

View File

@@ -189,7 +189,7 @@ constexpr std::uint32_t const tfNFTokenCreateOfferMask =
~(tfUniversal | tfSellNFToken); ~(tfUniversal | tfSellNFToken);
// NFTokenCancelOffer flags: // NFTokenCancelOffer flags:
constexpr std::uint32_t const tfNFTokenCancelOfferMask = ~(tfUniversal); constexpr std::uint32_t const tfNFTokenCancelOfferMask = ~tfUniversal;
// NFTokenAcceptOffer flags: // NFTokenAcceptOffer flags:
constexpr std::uint32_t const tfNFTokenAcceptOfferMask = ~tfUniversal; constexpr std::uint32_t const tfNFTokenAcceptOfferMask = ~tfUniversal;

View File

@@ -7793,12 +7793,17 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env(token::mint(issuer, 0u), txflags(tfMutable)); env(token::mint(issuer, 0u), txflags(tfMutable));
env.close(); env.close();
// Set a negative fee. Exercises invalid preflight1. // Set a negative fee. Exercises invalid preflight1.
env(token::modify(issuer, nftId), env(token::modify(issuer, nftId),
fee(STAmount(10ull, true)), fee(STAmount(10ull, true)),
ter(temBAD_FEE)); ter(temBAD_FEE));
env.close(); env.close();
// Invalid Flags
env(token::modify(issuer, nftId),
txflags(0x00000001),
ter(temINVALID_FLAG));
// Invalid Owner // Invalid Owner
env(token::modify(issuer, nftId), env(token::modify(issuer, nftId),
token::owner(issuer), token::owner(issuer),
@@ -7868,6 +7873,19 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env.fund(XRP(10000), issuer, alice, bob); env.fund(XRP(10000), issuer, alice, bob);
env.close(); env.close();
// modify with tfFullyCanonicalSig should success
uint256 const nftId{token::getNextID(env, issuer, 0u, tfMutable)};
env(token::mint(issuer, 0u), txflags(tfMutable), token::uri("uri"));
env.close();
env(token::modify(issuer, nftId), txflags(tfFullyCanonicalSig));
env.close();
}
{
Env env{*this, features};
env.fund(XRP(10000), issuer, alice, bob);
env.close();
// lambda that returns the JSON form of NFTokens held by acct // lambda that returns the JSON form of NFTokens held by acct
auto accountNFTs = [&env](Account const& acct) { auto accountNFTs = [&env](Account const& acct) {
Json::Value params; Json::Value params;

View File

@@ -37,6 +37,9 @@ NFTokenModify::preflight(PreflightContext const& ctx)
if (NotTEC const ret = preflight1(ctx); !isTesSuccess(ret)) if (NotTEC const ret = preflight1(ctx); !isTesSuccess(ret))
return ret; return ret;
if (ctx.tx.getFlags() & tfUniversalMask)
return temINVALID_FLAG;
if (auto owner = ctx.tx[~sfOwner]; owner == ctx.tx[sfAccount]) if (auto owner = ctx.tx[~sfOwner]; owner == ctx.tx[sfAccount])
return temMALFORMED; return temMALFORMED;