fix: prevent integer underflow in amount() bounds check
authoroblivionsage <cookieandcream560@gmail.com>
Thu, 13 Nov 2025 00:52:38 +0000 (01:52 +0100)
committeroblivionsage <cookieandcream560@gmail.com>
Thu, 13 Nov 2025 00:52:38 +0000 (01:52 +0100)
commitd248417f2cca1e93d6c6ccda07186bd71b8b6978
tree2ef6d6b83e1b4752f0ec77329e01ecf8c693585a
parent42dc35dc52e729676a8c7364893d93d78bad347d
fix: prevent integer underflow in amount() bounds check

The bounds check 'index > arr.size() - 1' has an edge case bug.
When arr.size() is 0, subtracting 1 from an unsigned size_t
underflows to SIZE_MAX, so 'index > SIZE_MAX' is always false.

This could theoretically allow out-of-bounds access, though it's
pretty hard to trigger in practice - would need a malformed/corrupted
unsigned_tx file that parses successfully but has no transactions.

Changed to 'arr.empty() || index >= arr.size()' which handles
the edge case properly.

Found with AddressSanitizer during fuzzing.
src/libwalletqt/UnsignedTransaction.cpp