From fa2a4fdef779b01e847def5985deafedc6dd3da8 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Wed, 14 Feb 2024 17:10:34 +0100 Subject: [PATCH] rpc: Fixed signed integer overflow for large feerates --- src/rpc/mempool.cpp | 8 ++------ test/functional/mempool_accept.py | 8 ++++++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp index c1753a1f6e..a5d27d7472 100644 --- a/src/rpc/mempool.cpp +++ b/src/rpc/mempool.cpp @@ -81,9 +81,7 @@ static RPCHelpMan sendrawtransaction() CTransactionRef tx(MakeTransactionRef(std::move(mtx))); - const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ? - DEFAULT_MAX_RAW_TX_FEE_RATE : - CFeeRate(AmountFromValue(request.params[1])); + const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg(1))}; int64_t virtual_size = GetVirtualTransactionSize(*tx); CAmount max_raw_tx_fee = max_raw_tx_fee_rate.GetFee(virtual_size); @@ -162,9 +160,7 @@ static RPCHelpMan testmempoolaccept() "Array must contain between 1 and " + ToString(MAX_PACKAGE_COUNT) + " transactions."); } - const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ? - DEFAULT_MAX_RAW_TX_FEE_RATE : - CFeeRate(AmountFromValue(request.params[1])); + const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg(1))}; std::vector txns; txns.reserve(raw_transactions.size()); diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py index 8f3aec96a7..538e1fe053 100755 --- a/test/functional/mempool_accept.py +++ b/test/functional/mempool_accept.py @@ -90,9 +90,17 @@ class MempoolAcceptanceTest(BitcoinTestFramework): txid_in_block = self.wallet.sendrawtransaction(from_node=node, tx_hex=raw_tx_in_block) self.generate(node, 1) self.mempool_size = 0 + # Also check feerate. 1BTC/kvB fails + assert_raises_rpc_error(-8, "Fee rates larger than or equal to 1BTC/kvB are not accepted", lambda: self.check_mempool_result( + result_expected=None, + rawtxs=[raw_tx_in_block], + maxfeerate=1, + )) + # ... 0.99 passes self.check_mempool_result( result_expected=[{'txid': txid_in_block, 'allowed': False, 'reject-reason': 'txn-already-known'}], rawtxs=[raw_tx_in_block], + maxfeerate=0.99, ) self.log.info('A transaction not in the mempool')