mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
Merge #17156: psbt: check that various indexes and amounts are within bounds
deaa6dd144psbt: check output index is within bounds before accessing (Andrew Chow)f1ef7f0aa4Don't calculate tx fees for PSBTs with invalid money values (Andrew Chow) Pull request description: Fixes #17149 Two classes of issues were found by the psbt fuzzer: values out of range and causing overflows, and prevout indexes being out of range. This PR fixes both. When accessing a specific output using the index given in the tx, check that it is actually a possible output before trying to access the output. When summing and checking amounts for `decodepsbt` and `analyzepsbt`, make sure that the values are actually valid money values.. Otherwise, stop summing and don't show the fee. For `analyzepsbt`, return that the next role is the Creator since the Creator needs to remake the transaction to be valid. ACKs for top commit: practicalswift: ACKdeaa6dd144-- only change since last ACK was the addition of tests gwillen: tested ACKdeaa6dd, would also like to see this merged! Tree-SHA512: 06c36720bbb5a7ab1c29f7d15878bf9f0d3e5760c06bff479d412e1bf07bb3e0e9ab6cca820a4bfedaab71bfd7af813807e87cbcdf0af25cc3f66a53a06dbcfd
This commit is contained in:
@@ -1079,7 +1079,12 @@ UniValue decodepsbt(const JSONRPCRequest& request)
|
||||
UniValue out(UniValue::VOBJ);
|
||||
|
||||
out.pushKV("amount", ValueFromAmount(txout.nValue));
|
||||
total_in += txout.nValue;
|
||||
if (MoneyRange(txout.nValue) && MoneyRange(total_in + txout.nValue)) {
|
||||
total_in += txout.nValue;
|
||||
} else {
|
||||
// Hack to just not show fee later
|
||||
have_all_utxos = false;
|
||||
}
|
||||
|
||||
UniValue o(UniValue::VOBJ);
|
||||
ScriptToUniv(txout.scriptPubKey, o, true);
|
||||
@@ -1089,7 +1094,13 @@ UniValue decodepsbt(const JSONRPCRequest& request)
|
||||
UniValue non_wit(UniValue::VOBJ);
|
||||
TxToUniv(*input.non_witness_utxo, uint256(), non_wit, false);
|
||||
in.pushKV("non_witness_utxo", non_wit);
|
||||
total_in += input.non_witness_utxo->vout[psbtx.tx->vin[i].prevout.n].nValue;
|
||||
CAmount utxo_val = input.non_witness_utxo->vout[psbtx.tx->vin[i].prevout.n].nValue;
|
||||
if (MoneyRange(utxo_val) && MoneyRange(total_in + utxo_val)) {
|
||||
total_in += utxo_val;
|
||||
} else {
|
||||
// Hack to just not show fee later
|
||||
have_all_utxos = false;
|
||||
}
|
||||
} else {
|
||||
have_all_utxos = false;
|
||||
}
|
||||
@@ -1205,7 +1216,12 @@ UniValue decodepsbt(const JSONRPCRequest& request)
|
||||
outputs.push_back(out);
|
||||
|
||||
// Fee calculation
|
||||
output_value += psbtx.tx->vout[i].nValue;
|
||||
if (MoneyRange(psbtx.tx->vout[i].nValue) && MoneyRange(output_value + psbtx.tx->vout[i].nValue)) {
|
||||
output_value += psbtx.tx->vout[i].nValue;
|
||||
} else {
|
||||
// Hack to just not show fee later
|
||||
have_all_utxos = false;
|
||||
}
|
||||
}
|
||||
result.pushKV("outputs", outputs);
|
||||
if (have_all_utxos) {
|
||||
|
||||
Reference in New Issue
Block a user