Merge 3b5fb6e77a into merged_master (Bitcoin PR bitcoin/bitcoin#26213)

This commit is contained in:
Tom Trevethan 2025-03-26 12:30:53 +00:00
commit 5baaf035fa
5 changed files with 16 additions and 10 deletions

View file

@ -0,0 +1,8 @@
Low-level changes
=================
- Previously `setban`, `addpeeraddress`, `walletcreatefundedpsbt`, methods
allowed non-boolean and non-null values to be passed as boolean parameters.
Any string, number, array, or object value that was passed would be treated
as false. After this change, passing any value except `true`, `false`, or
`null` now triggers a JSON value is not of expected type error. (#26213)

View file

@ -731,9 +731,7 @@ static RPCHelpMan setban()
if (!request.params[2].isNull())
banTime = request.params[2].getInt<int64_t>();
bool absolute = false;
if (request.params[3].isTrue())
absolute = true;
const bool absolute{request.params[3].isNull() ? false : request.params[3].get_bool()};
if (isSubnet) {
node.banman->Ban(subNet, banTime, absolute);
@ -942,7 +940,7 @@ static RPCHelpMan addpeeraddress()
const std::string& addr_string{request.params[0].get_str()};
const auto port{request.params[1].getInt<uint16_t>()};
const bool tried{request.params[2].isTrue()};
const bool tried{request.params[2].isNull() ? false : request.params[2].get_bool()};
UniValue obj(UniValue::VOBJ);
CNetAddr net_addr;

View file

@ -363,7 +363,7 @@ static RPCHelpMan createrawtransaction()
std::optional<bool> rbf;
if (!request.params[3].isNull()) {
rbf = request.params[3].isTrue();
rbf = request.params[3].get_bool();
}
auto tip = WITH_LOCK(::cs_main, return chainman.ActiveChain().Tip());
CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf, tip);
@ -1894,7 +1894,7 @@ static RPCHelpMan createpsbt()
std::optional<bool> rbf;
if (!request.params[3].isNull()) {
rbf = request.params[3].isTrue();
rbf = request.params[3].get_bool();
}
std::map<CTxOut, PSBTOutput> psbt_outs;
auto tip = WITH_LOCK(::cs_main, return chainman.ActiveChain().Tip());

View file

@ -1830,11 +1830,8 @@ RPCHelpMan walletcreatefundedpsbt()
CAmount fee;
int change_position;
bool rbf{wallet.m_signal_rbf};
const UniValue &replaceable_arg = options["replaceable"];
if (!replaceable_arg.isNull()) {
rbf = replaceable_arg.isTrue();
}
const bool rbf{replaceable_arg.isNull() ? wallet.m_signal_rbf : replaceable_arg.get_bool()};
// It's hard to control the behavior of FundTransaction, so we will wait
// until after it's done, then extract the blinding keys from the output
// nonces.

View file

@ -307,6 +307,9 @@ class NetTest(BitcoinTestFramework):
assert_equal(node.addpeeraddress(address="", port=8333), {"success": False})
assert_equal(node.getnodeaddresses(count=0), [])
self.log.debug("Test that non-bool tried fails")
assert_raises_rpc_error(-3, "JSON value of type string is not of expected type bool", self.nodes[0].addpeeraddress, address="1.2.3.4", tried="True", port=1234)
self.log.debug("Test that adding an address with invalid port fails")
assert_raises_rpc_error(-1, "JSON integer out of range", self.nodes[0].addpeeraddress, address="1.2.3.4", port=-1)
assert_raises_rpc_error(-1, "JSON integer out of range", self.nodes[0].addpeeraddress,address="1.2.3.4", port=65536)