While fuzzing the RPC interface I stumbled upon a signed integer overflow in CTxMemPool::PrioritiseTransaction(…)
which is reachable via the following two prioritisetransaction
RPC calls:
0$ ./autogen.sh
1$ CC=clang CXX=clang++ ./configure --with-sanitizers=address,undefined
2$ make
3$ UBSAN_OPTIONS="print_stacktrace=1" src/bitcoind &
4$ src/bitcoin-cli prioritisetransaction cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe 0 -9123456789123456789
5$ src/bitcoin-cli prioritisetransaction cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe 0 -9123456789123456789
6txmempool.cpp:832:15: runtime error: signed integer overflow: -9123456789123456789 + -9123456789123456789 cannot be represented in type 'long'
7 [#0](/bitcoin-bitcoin/0/) 0x5581f3e69c3c in CTxMemPool::PrioritiseTransaction(uint256 const&, long const&) src/txmempool.cpp:832:15
8 [#1](/bitcoin-bitcoin/1/) 0x5581f3c93852 in prioritisetransaction()::$_6::operator()(RPCHelpMan const&, JSONRPCRequest const&) const src/rpc/mining.cpp:470:36
9…
10
11SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior txmempool.cpp:832:15
Nothing high priority of course, but still worth fixing :)