Skip to content

Commit 8b01033

Browse files
fix: reject oversized payout arrays in rpc
1 parent ec013c5 commit 8b01033

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

src/rpc/evo.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,9 @@ static MasternodePayoutShares ParsePayouts(const UniValue& value, const std::str
282282
if (arr.empty()) {
283283
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must contain at least one entry", paramName));
284284
}
285+
if (arr.size() > 8) {
286+
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must not contain more than 8 entries", paramName));
287+
}
285288
for (size_t i = 0; i < arr.size(); ++i) {
286289
const UniValue& entry = arr[i];
287290
if (!entry.isObject()) {

test/functional/feature_masternode_payout_shares.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ def run_test(self):
8383
{"address": payout1, "reward": 7000},
8484
{"address": payout2, "reward": 3000},
8585
]
86+
oversized_payouts = [{"address": node.getnewaddress(), "reward": 1000} for _ in range(9)]
8687

8788
collateral_txid = node.sendmany("", {mn.collateral_address: mn.get_collateral_value(), mn.fundsAddr: 1})
8889
self.bump_mocktime(10 * 60 + 1)
@@ -103,6 +104,19 @@ def run_test(self):
103104
expected_assert_msg="payouts must contain at least one entry",
104105
)
105106

107+
mn.register(
108+
node,
109+
submit=True,
110+
collateral_txid=mn.collateral_txid,
111+
collateral_vout=mn.collateral_vout,
112+
addrs_core_p2p=[f"127.0.0.1:{mn.nodePort}"],
113+
operator_reward=0,
114+
payouts=oversized_payouts,
115+
fundsAddr=mn.fundsAddr,
116+
expected_assert_code=-8,
117+
expected_assert_msg="payouts must not contain more than 8 entries",
118+
)
119+
106120
protx_hash = mn.register(
107121
node,
108122
submit=True,
@@ -137,6 +151,15 @@ def run_test(self):
137151
expected_assert_msg="payouts must contain at least one entry",
138152
)
139153

154+
mn.update_registrar(
155+
node,
156+
submit=True,
157+
payouts=oversized_payouts,
158+
fundsAddr=mn.fundsAddr,
159+
expected_assert_code=-8,
160+
expected_assert_msg="payouts must not contain more than 8 entries",
161+
)
162+
140163
gbt_payees = [p for p in node.getblocktemplate()["masternode"] if p["script"] != "6a"]
141164
assert_equal(len(gbt_payees), 2)
142165
assert_equal(gbt_payees[0]["payee"], payout1)

0 commit comments

Comments
 (0)