From 7220ee3fc775486b595642c761528e5b9cef40cf Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Mon, 16 Feb 2026 12:31:40 +0100 Subject: [PATCH 01/10] util: Fix UB in SetStdinEcho when ENOTTY Github-Pull: #34597 Rebased-From: fa692974ac2d69e01091f03625cd8a227e310065 --- contrib/valgrind.supp | 6 ------ src/compat/stdin.cpp | 21 +++++++++++++++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/contrib/valgrind.supp b/contrib/valgrind.supp index 7960f9c8e4f..40f8fb2b698 100644 --- a/contrib/valgrind.supp +++ b/contrib/valgrind.supp @@ -14,12 +14,6 @@ # Note that suppressions may depend on OS and/or library versions. # Tested on aarch64 and x86_64 with Ubuntu Noble system libs, using clang-16 # and GCC, without gui. -{ - Suppress uninitialized bytes warning in compat code - Memcheck:Param - ioctl(TCSET{S,SW,SF}) - fun:tcsetattr -} { Suppress leaks on shutdown Memcheck:Leak diff --git a/src/compat/stdin.cpp b/src/compat/stdin.cpp index c11763f68fd..ba46a70963f 100644 --- a/src/compat/stdin.cpp +++ b/src/compat/stdin.cpp @@ -18,25 +18,38 @@ // https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin void SetStdinEcho(bool enable) { + if (!StdinTerminal()) { + return; + } #ifdef WIN32 HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); DWORD mode; - GetConsoleMode(hStdin, &mode); + if (!GetConsoleMode(hStdin, &mode)) { + fputs("GetConsoleMode failed\n", stderr); + return; + } if (!enable) { mode &= ~ENABLE_ECHO_INPUT; } else { mode |= ENABLE_ECHO_INPUT; } - SetConsoleMode(hStdin, mode); + if (!SetConsoleMode(hStdin, mode)) { + fputs("SetConsoleMode failed\n", stderr); + } #else struct termios tty; - tcgetattr(STDIN_FILENO, &tty); + if (tcgetattr(STDIN_FILENO, &tty) != 0) { + fputs("tcgetattr failed\n", stderr); + return; + } if (!enable) { tty.c_lflag &= ~ECHO; } else { tty.c_lflag |= ECHO; } - (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty); + if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) { + fputs("tcsetattr failed\n", stderr); + } #endif } From 475a5b0504faabb17445dd66c54d34086262c085 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Mon, 16 Feb 2026 14:54:50 +0100 Subject: [PATCH 02/10] refactor: Use static_cast to suppress integer sanitizer warning This refactor does not change any behavior, except for the integer sanitizer warning. Can be tested via: UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:print_stacktrace=1:halt_on_error=1:report_error_type=1" ./bld-cmake/bin/bitcoin-cli -stdinrpcpass uptime Github-Pull: #34597 Rebased-From: fa6af856341384e4a84c5674e66fe7c1f13dd73c --- src/compat/stdin.cpp | 2 +- test/sanitizer_suppressions/ubsan | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/compat/stdin.cpp b/src/compat/stdin.cpp index ba46a70963f..638fd532d3c 100644 --- a/src/compat/stdin.cpp +++ b/src/compat/stdin.cpp @@ -43,7 +43,7 @@ void SetStdinEcho(bool enable) return; } if (!enable) { - tty.c_lflag &= ~ECHO; + tty.c_lflag &= static_cast(~ECHO); } else { tty.c_lflag |= ECHO; } diff --git a/test/sanitizer_suppressions/ubsan b/test/sanitizer_suppressions/ubsan index 77aed1aa8a1..2702ed04f4a 100644 --- a/test/sanitizer_suppressions/ubsan +++ b/test/sanitizer_suppressions/ubsan @@ -60,7 +60,6 @@ unsigned-integer-overflow:TxConfirmStats::EstimateMedianVal unsigned-integer-overflow:InsecureRandomContext::rand64 unsigned-integer-overflow:InsecureRandomContext::SplitMix64 unsigned-integer-overflow:bitset_detail::PopCount -implicit-integer-sign-change:SetStdinEcho implicit-integer-sign-change:compressor.h implicit-integer-sign-change:crypto/ implicit-integer-sign-change:TxConfirmStats::removeTx From 304250983ee91580b34c1a193b63371dbf689b20 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Sun, 14 Dec 2025 13:50:23 +0100 Subject: [PATCH 03/10] netif: fix compilation warning in QueryDefaultGatewayImpl() ``` src/common/netif.cpp:137:51: error: comparison of integers of different signs: 'int64_t' (aka 'long') and 'unsigned long' [-Werror,-Wsign-compare] 137 | for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, recv_result); hdr = NLMSG_NEXT(hdr, recv_result)) { | ^~~~~~~~~~~~~~~~~~~~~~~~~~ /usr/include/netlink/netlink.h:220:31: note: expanded from macro 'NLMSG_OK' 220 | #define NLMSG_OK(_hdr, _len) NL_ITEM_OK(_hdr, _len, NLMSG_HDRLEN, _NLMSG_LEN) | ^ ~~~~ ~~~~~~~~~~~~ /usr/include/netlink/netlink.h:203:10: note: expanded from macro 'NL_ITEM_OK' 203 | ((_len) >= _hlen && _LEN_M(_ptr) >= _hlen && _LEN_M(_ptr) <= (_len)) | ~~~~ ^ ~~~~~ 1 error generated. ``` Happens on FreeBSD 15.0, with the default compiler (Clang 19). On FreeBSD 14, `/usr/include/netlink/netlink.h` contains: ``` #define NLMSG_HDRLEN ((int)sizeof(struct nlmsghdr)) ``` On FreeBSD 15, `/usr/include/netlink/netlink.h` contains: ``` #define NLMSG_HDRLEN (sizeof(struct nlmsghdr)) ``` Co-authored-by: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Github-Pull: #34093 Rebased-From: c1361fc42dd60606fcd6273cede1083cd88866a2 --- src/common/netif.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/netif.cpp b/src/common/netif.cpp index 378f0f57e78..6af356e5f77 100644 --- a/src/common/netif.cpp +++ b/src/common/netif.cpp @@ -34,6 +34,8 @@ #include #endif +#include + namespace { //! Return CNetAddr for the specified OS-level network address. @@ -134,7 +136,9 @@ std::optional QueryDefaultGatewayImpl(sa_family_t family) return std::nullopt; } - for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, recv_result); hdr = NLMSG_NEXT(hdr, recv_result)) { + using recv_result_t = std::conditional_t, int64_t, decltype(NLMSG_HDRLEN)>; + + for (nlmsghdr* hdr = (nlmsghdr*)response; NLMSG_OK(hdr, static_cast(recv_result)); hdr = NLMSG_NEXT(hdr, recv_result)) { if (!(hdr->nlmsg_flags & NLM_F_MULTI)) { done = true; } From c17a5cd5f85176b95edc596141887821b56699d1 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Fri, 27 Feb 2026 14:09:15 +0100 Subject: [PATCH 04/10] test: Add missing timeout_factor to zmq socket Github-Pull: #34690 Rebased-From: fa48f8c8655d93e78b32b560a870577909b666d3 --- test/functional/interface_zmq.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/interface_zmq.py b/test/functional/interface_zmq.py index 11cd8e63485..fa28dc8dda3 100755 --- a/test/functional/interface_zmq.py +++ b/test/functional/interface_zmq.py @@ -174,7 +174,7 @@ class ZMQTest (BitcoinTestFramework): # set subscriber's desired timeout for the test for sub in subscribers: - sub.socket.set(zmq.RCVTIMEO, recv_timeout*1000) + sub.socket.set(zmq.RCVTIMEO, int(recv_timeout * self.options.timeout_factor * 1000)) self.connect_nodes(0, 1) if sync_blocks: From e1210ac2597673783a16e98c1727d28797461f22 Mon Sep 17 00:00:00 2001 From: Ryan Ofsky Date: Sun, 1 Mar 2026 12:31:59 -0500 Subject: [PATCH 05/10] doc: Improve dependencies.md IPC documentation Improve dependencies.md to document IPC dependencies better: - Link to native_capnp.mk file not capnp.mk file so it's possible to see what version of Cap'n Proto is being used in release binaries. This is important since #31895 dropped the "Version Used" column and the capnp.mk file does not include version number. - Indicate Capn"Proto is used for IPC and link to multiprocess.md documenting the feature. - Link to correct PR requiring Cap'n Proto 0.7.1. Previous link was pointing at PR which required 0.7.0. - Mention libmultiprocess as a dependency even though it is included as a git subtree and can be built as a cmake subproject. Libmultiprocess still needs to be built separately when cross compiling, and is useful to build separately when developing, and is still a depends package. Based on 2cf352fd8e6a77003e38d954b6c879b20d4b960a from #33623 by willcl-ark which made similar changes in the 29.x branch. Github-Pull: #34706 Rebased-From: b87a1c27c99821cea995112114eb40afa93417f2 --- doc/dependencies.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/dependencies.md b/doc/dependencies.md index 79f7f05e8af..5cc1e1cb944 100644 --- a/doc/dependencies.md +++ b/doc/dependencies.md @@ -35,7 +35,8 @@ Bitcoin Core requires one of the following compilers. | Dependency | Releases | Minimum required | | --- | --- | --- | -| [Cap'n Proto](../depends/packages/capnp.mk) | [link](https://capnproto.org) | [0.7.1](https://github.com/bitcoin/bitcoin/pull/28907) | +| [Cap'n Proto](../depends/packages/native_capnp.mk) ([IPC](multiprocess.md)) | [link](https://capnproto.org/) | [0.7.1](https://github.com/bitcoin/bitcoin/pull/33241) | +| [libmultiprocess](../depends/packages/native_libmultiprocess.mk) ([IPC](multiprocess.md)) | [link](https://github.com/bitcoin-core/libmultiprocess/tags) | [v7.0-pre1](https://github.com/bitcoin/bitcoin/pull/33517) | | Python (scripts, tests) | [link](https://www.python.org) | [3.10](https://github.com/bitcoin/bitcoin/pull/30527) | | [Qt](../depends/packages/qt.mk) (gui) | [link](https://download.qt.io/archive/qt/) | [6.2](https://github.com/bitcoin/bitcoin/pull/30997) | | [qrencode](../depends/packages/qrencode.mk) (gui) | [link](https://fukuchi.org/works/qrencode/) | N/A | From d221d1c633dce8bf8c6090b461656937b9b06915 Mon Sep 17 00:00:00 2001 From: tboy1337 Date: Mon, 12 Jan 2026 12:47:30 +0000 Subject: [PATCH 06/10] psbt: validate pubkeys in MuSig2 pubnonce/partial sig deserialization Add validation for pubkeys in MuSig2 pubnonce and partial signature deserialization to prevent crashes with invalid curve points. - Validate aggregate and participant pubkeys in PSBT MuSig2 fields - Add comprehensive test coverage for invalid pubkey rejection - Ensure proper error handling during PSBT deserialization Github-Pull: #34219 Rebased-From: f51665bee72c26d3f3cc6813b6c02adad5f0af6a --- src/psbt.h | 7 +++++++ test/functional/data/rpc_psbt.json | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/psbt.h b/src/psbt.h index f8098b04503..04986ce13fd 100644 --- a/src/psbt.h +++ b/src/psbt.h @@ -236,7 +236,14 @@ void DeserializeMuSig2ParticipantDataIdentifier(Stream& skey, CPubKey& agg_pub, skey >> std::as_writable_bytes(std::span{part_pubkey_bytes}) >> std::as_writable_bytes(std::span{agg_pubkey_bytes}); agg_pub.Set(agg_pubkey_bytes.begin(), agg_pubkey_bytes.end()); + if (!agg_pub.IsFullyValid()) { + throw std::ios_base::failure("musig2 aggregate pubkey is invalid"); + } + part_pub.Set(part_pubkey_bytes.begin(), part_pubkey_bytes.end()); + if (!part_pub.IsFullyValid()) { + throw std::ios_base::failure("musig2 participant pubkey is invalid"); + } if (!skey.empty()) { skey >> leaf_hash; diff --git a/test/functional/data/rpc_psbt.json b/test/functional/data/rpc_psbt.json index 062a54936af..8acf501f0bd 100644 --- a/test/functional/data/rpc_psbt.json +++ b/test/functional/data/rpc_psbt.json @@ -90,6 +90,22 @@ [ "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", "Size of value was not the stated size" + ], + [ + "cHNidP8BAFICAAAAASWJ53Z5WLoVT5AYzM8N7ephR7tgzRoZS241kKmWVpDWAQAAAAD9////ARjd9QUAAAAAFgAUyRI+BujX8JZsXRzQ+TMALU63V80AAAAAAAEBKwDh9QUAAAAAIlEg0LImxlmfJzh034/mhKtsMCgIG+6KLL7TGhNvWGX2z6QhFjRrmVkzVxB8nTRZ6d66jT6vROZjbIXH+FPrkLpS6M0ABQBYCwiHIRZPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLAUAwySagiEWjdlquFiyWcUYIYwBSkbrTmrImeUcZ173dPu2ioeZzi8NACaA3W4BAAAAAgAAACEW+TCKAZJYwxBJNE+F+J1SKbUxyEWDb5mwhgHxE7zgNvkFAH3WVZIBFyCN2Wq4WLJZxRghjAFKRutOasiZ5RxnXvd0+7aKh5nOLyIaAwtY4zeqTThSqMKTh8QkCNjPvjphOl45fgqfAaX7cQfUYwI0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAAJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLAL5MIoBkljDEEk0T4X4nVIptTHIRYNvmbCGAfETvOA2+UMbAk+v1l+BaRhvwr/bIjPHfmMNEL4oCiTHFlwJonYRd1wsAtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kQgOjJKP0Ihv6srb6B4anBI8zRc40TxRY4VG6GHtZqrSYywKjY4JZukzMRv552NeaTZ5wTsD3cBteZk1NhzODivSRlkMbAvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5AtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kQgLBLrTvh2AyHAcqUdj7ZcNO6LRSoUgYVX9h3wYShaWAkQOgjkGyYpQsblky/R+12ZI2iXmJ9ukS3CFHbSdxh0EUk0Mb0kSzWjtpjQM5dsRU2Eg/PTsX6bcFgeuZWOqYfPkzyBX2AtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kQgJO78n90SvnR0ZIXGeLgmiUnMkjbp/OgiQTlVI68EJivwOMJ26DKq1L+56QSFFi9XTIsmGd9b0Z24/6LrAFlJO/GwAA", + "musig2 participant pubkey is invalid" + ], + [ + "cHNidP8BAFICAAAAASWJ53Z5WLoVT5AYzM8N7ephR7tgzRoZS241kKmWVpDWAQAAAAD9////ARjd9QUAAAAAFgAUyRI+BujX8JZsXRzQ+TMALU63V80AAAAAAAEBKwDh9QUAAAAAIlEg0LImxlmfJzh034/mhKtsMCgIG+6KLL7TGhNvWGX2z6QBE0CeOYl6wv/idSXcRg+FhP3dEf6al84uUMFIm4waTpL8wH5I22OhpMy50pdTfQwDiDg3i78njeeqGhKJldFiXMXNIRY0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAAUAWAsIhyEWT6/WX4FpGG/Cv9siM8d+Yw0QvigKJMcWXAmidhF3XCwFAMMkmoIhFo3ZarhYslnFGCGMAUpG605qyJnlHGde93T7toqHmc4vDQAmgN1uAQAAAAIAAAAhFvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5BQB91lWSARcgjdlquFiyWcUYIYwBSkbrTmrImeUcZ173dPu2ioeZzi8iGgMLWOM3qk04UqjCk4fEJAjYz746YTpeOX4KnwGl+3EH1GMCNGuZWTNXEHydNFnp3rqNPq9E5mNshcf4U+uQulLozQACT6/WX4FpGG/Cv9siM8d+Yw0QvigKJMcWXAmidhF3XCwC+TCKAZJYwxBJNE+F+J1SKbUxyEWDb5mwhgHxE7zgNvlDGwI0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEICTu/J/dEr50dGSFxni4JolJzJI26fzoIkE5VSOvBCYr8DjCdugyqtS/uekEhRYvV0yLJhnfW9GduP+i6wBZSTvxtDGwJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEIDoySj9CIb+rK2+geGpwSPM0XONE8UWOFRuhh7Waq0mMsCo2OCWbpMzEb+edjXmk2ecE7A93AbXmZNTYczg4r0kZZDGwL5MIoBkljDEEk0T4X4nVIptTHIRYNvmbCGAfETvOA2+QLQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEICwS6074dgMhwHKlHY+2XDTui0UqFIGFV/Yd8GEoWlgJEDoI5BsmKULG5ZMv0ftdmSNol5ifbpEtwhR20ncYdBFJNDHAJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpCDnhVL7TOmy0A4e0OLLmOCHGZEnR36PGhxoGgC5xM5wmEMcAvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5AtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kIMvMlXhqHGdNSNisUuMi3Xxuq6w7/Evnm3UN4o34Li9zQxy9GBUQ2ZeszqyEQK2COnd79TGhILEsdA0ocnS0vqs9z/IC0LImxlmfJzh034/mhKtsMCgIG+6KLL7TGhNvWGX2z6QgZX2yhr4U6A7ODdhLTRfE3EFMPla8jO8IJ7BhtN0sj0MAAA==", + "musig2 participant pubkey is invalid" + ], + [ + "cHNidP8BAFICAAAAASWJ53Z5WLoVT5AYzM8N7ephR7tgzRoZS241kKmWVpDWAQAAAAD9////ARjd9QUAAAAAFgAUyRI+BujX8JZsXRzQ+TMALU63V80AAAAAAAEBKwDh9QUAAAAAIlEg0LImxlmfJzh034/mhKtsMCgIG+6KLL7TGhNvWGX2z6QhFjRrmVkzVxB8nTRZ6d66jT6vROZjbIXH+FPrkLpS6M0ABQBYCwiHIRZPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLAUAwySagiEWjdlquFiyWcUYIYwBSkbrTmrImeUcZ173dPu2ioeZzi8NACaA3W4BAAAAAgAAACEW+TCKAZJYwxBJNE+F+J1SKbUxyEWDb5mwhgHxE7zgNvkFAH3WVZIBFyCN2Wq4WLJZxRghjAFKRutOasiZ5RxnXvd0+7aKh5nOLyIaAwtY4zeqTThSqMKTh8QkCNjPvjphOl45fgqfAaX7cQfUYwI0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAAJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLAL5MIoBkljDEEk0T4X4nVIptTHIRYNvmbCGAfETvOA2+UMbAk+v1l+BaRhvwr/bIjPHfmMNEL4oCiTHFlwJonYRd1wsAtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kQgOjJKP0Ihv6srb6B4anBI8zRc40TxRY4VG6GHtZqrSYywKjY4JZukzMRv552NeaTZ5wTsD3cBteZk1NhzODivSRlkMbAvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5AtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kQgLBLrTvh2AyHAcqUdj7ZcNO6LRSoUgYVX9h3wYShaWAkQOgjkGyYpQsblky/R+12ZI2iXmJ9ukS3CFHbSdxh0EUk0MbAjRrmVkzVxB8nTRZ6d66jT6vROZjbIXH+FPrkLpS6M0A24oIbe9JQsYZIdUKU0vvOQHc/23mGL2R5js8lN/JmLWHQgJO78n90SvnR0ZIXGeLgmiUnMkjbp/OgiQTlVI68EJivwOMJ26DKq1L+56QSFFi9XTIsmGd9b0Z24/6LrAFlJO/GwAA", + "musig2 aggregate pubkey is invalid" + ], + [ + "cHNidP8BAFICAAAAASWJ53Z5WLoVT5AYzM8N7ephR7tgzRoZS241kKmWVpDWAQAAAAD9////ARjd9QUAAAAAFgAUyRI+BujX8JZsXRzQ+TMALU63V80AAAAAAAEBKwDh9QUAAAAAIlEg0LImxlmfJzh034/mhKtsMCgIG+6KLL7TGhNvWGX2z6QBE0CeOYl6wv/idSXcRg+FhP3dEf6al84uUMFIm4waTpL8wH5I22OhpMy50pdTfQwDiDg3i78njeeqGhKJldFiXMXNIRY0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAAUAWAsIhyEWT6/WX4FpGG/Cv9siM8d+Yw0QvigKJMcWXAmidhF3XCwFAMMkmoIhFo3ZarhYslnFGCGMAUpG605qyJnlHGde93T7toqHmc4vDQAmgN1uAQAAAAIAAAAhFvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5BQB91lWSARcgjdlquFiyWcUYIYwBSkbrTmrImeUcZ173dPu2ioeZzi8iGgMLWOM3qk04UqjCk4fEJAjYz746YTpeOX4KnwGl+3EH1GMCNGuZWTNXEHydNFnp3rqNPq9E5mNshcf4U+uQulLozQACT6/WX4FpGG/Cv9siM8d+Yw0QvigKJMcWXAmidhF3XCwC+TCKAZJYwxBJNE+F+J1SKbUxyEWDb5mwhgHxE7zgNvlDGwI0a5lZM1cQfJ00Weneuo0+r0TmY2yFx/hT65C6UujNAALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEICTu/J/dEr50dGSFxni4JolJzJI26fzoIkE5VSOvBCYr8DjCdugyqtS/uekEhRYvV0yLJhnfW9GduP+i6wBZSTvxtDGwJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEIDoySj9CIb+rK2+geGpwSPM0XONE8UWOFRuhh7Waq0mMsCo2OCWbpMzEb+edjXmk2ecE7A93AbXmZNTYczg4r0kZZDGwL5MIoBkljDEEk0T4X4nVIptTHIRYNvmbCGAfETvOA2+QLQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpEICwS6074dgMhwHKlHY+2XDTui0UqFIGFV/Yd8GEoWlgJEDoI5BsmKULG5ZMv0ftdmSNol5ifbpEtwhR20ncYdBFJNDHAJPr9ZfgWkYb8K/2yIzx35jDRC+KAokxxZcCaJ2EXdcLALQsibGWZ8nOHTfj+aEq2wwKAgb7oosvtMaE29YZfbPpCDnhVL7TOmy0A4e0OLLmOCHGZEnR36PGhxoGgC5xM5wmEMcAvkwigGSWMMQSTRPhfidUim1MchFg2+ZsIYB8RO84Db5AtCyJsZZnyc4dN+P5oSrbDAoCBvuiiy+0xoTb1hl9s+kIMvMlXhqHGdNSNisUuMi3Xxuq6w7/Evnm3UN4o34Li9zQxwCNGuZWTNXEHydNFnp3rqNPq9E5mNshcf4U+uQulLozQBq5voHDYXyLgYYDZRwd2Cemo5Lf+nNM2aIGiiZxmFnVU8gZX2yhr4U6A7ODdhLTRfE3EFMPla8jO8IJ7BhtN0sj0MAAA==", + "musig2 aggregate pubkey is invalid" ] ], "valid" : [ From 47ed3066890fa69cc7a925ba5a5400dc564f5054 Mon Sep 17 00:00:00 2001 From: Hennadii Stepanov <32963518+hebasto@users.noreply.github.com> Date: Mon, 2 Mar 2026 17:59:19 +0000 Subject: [PATCH 07/10] depends: Allow building Qt packages after interruption Github-Pull: #34713 Rebased-From: 2a7a4f608a42acef5cdf7370f0d191119fdb94c9 --- depends/packages/native_qt.mk | 8 ++++---- depends/packages/qt.mk | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/depends/packages/native_qt.mk b/depends/packages/native_qt.mk index 38469d6b61e..18cbc6d90e3 100644 --- a/depends/packages/native_qt.mk +++ b/depends/packages/native_qt.mk @@ -117,14 +117,14 @@ define $(package)_extract_cmds echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - mkdir qtbase && \ + mkdir -p qtbase && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ - mkdir qttranslations && \ + mkdir -p qttranslations && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ - mkdir qttools && \ + mkdir -p qttools && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools && \ cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ - mkdir cmake && \ + mkdir -p cmake && \ cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) endef diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index df327ffb804..6b2f74f591b 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -233,14 +233,14 @@ define $(package)_extract_cmds echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - mkdir qtbase && \ + mkdir -p qtbase && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ - mkdir qttranslations && \ + mkdir -p qttranslations && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ - mkdir qttools && \ + mkdir -p qttools && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools && \ cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ - mkdir cmake && \ + mkdir -p cmake && \ cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) endef @@ -252,10 +252,10 @@ define $(package)_extract_cmds echo "$($(package)_top_cmake_ecmoptionaladdsubdirectory_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ echo "$($(package)_top_cmake_qttoplevelhelpers_sha256_hash) $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ - mkdir qtbase && \ + mkdir -p qtbase && \ $(build_TAR) --no-same-owner --strip-components=1 -xf $($(package)_source) -C qtbase && \ cp $($(package)_source_dir)/$($(package)_top_cmakelists_file_name)-$($(package)_version) ./$($(package)_top_cmakelists_file_name) && \ - mkdir cmake && \ + mkdir -p cmake && \ cp $($(package)_source_dir)/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_ecmoptionaladdsubdirectory_file_name) && \ cp $($(package)_source_dir)/$($(package)_top_cmake_qttoplevelhelpers_file_name)-$($(package)_version) cmake/$($(package)_top_cmake_qttoplevelhelpers_file_name) endef From 597ac362850fe6829bb3029aa5a180a998f6aa95 Mon Sep 17 00:00:00 2001 From: nervana21 <205626986+nervana21@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:36:20 -0500 Subject: [PATCH 08/10] doc: Fix `fee` field in `getblock` RPC result The `fee` field in the `getblock` RPC result (verbosity 2 and 3) may be omitted when block undo data is not available. Marking it optional in the `RPCResult` aligns the documented schema with the runtime behavior. Github-Pull: #34702 Rebased-From: f580cc7e9f26331f7f03a8bbc5722521eb159bb2 --- src/rpc/blockchain.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index 4ef863a4805..a20affafee7 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -787,7 +787,7 @@ static RPCHelpMan getblock() {RPCResult::Type::OBJ, "", "", { {RPCResult::Type::ELISION, "", "The transactions in the format of the getrawtransaction RPC. Different from verbosity = 1 \"tx\" result"}, - {RPCResult::Type::NUM, "fee", "The transaction fee in " + CURRENCY_UNIT + ", omitted if block undo data is not available"}, + {RPCResult::Type::NUM, "fee", /*optional=*/true, "The transaction fee in " + CURRENCY_UNIT + ", omitted if block undo data is not available"}, }}, }}, }}, From 0f9e08f8709da4baced7593a04aff6cdcc90c31f Mon Sep 17 00:00:00 2001 From: fanquake Date: Tue, 10 Mar 2026 14:11:10 +0000 Subject: [PATCH 09/10] doc: update build guides pre v31 We are testing on FreeBSD 15 (nightly) and macOS 26 (CI). Github-Pull: #34789 Rebased-From: 6b20ad84e0a66c48976a599a7cc5b9b19cd49fab --- doc/build-freebsd.md | 2 +- doc/build-osx.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/build-freebsd.md b/doc/build-freebsd.md index b5940c0f7ce..de373d1ecb1 100644 --- a/doc/build-freebsd.md +++ b/doc/build-freebsd.md @@ -1,6 +1,6 @@ # FreeBSD Build Guide -**Updated for FreeBSD [14.3](https://www.freebsd.org/releases/14.3R/announce/)** +**Updated for FreeBSD [15.0](https://www.freebsd.org/releases/15.0R/announce/)** This guide describes how to build bitcoind, command-line utilities, and GUI on FreeBSD. diff --git a/doc/build-osx.md b/doc/build-osx.md index 001c0188e8a..3c2b0f3a2d9 100644 --- a/doc/build-osx.md +++ b/doc/build-osx.md @@ -1,6 +1,6 @@ # macOS Build Guide -**Updated for MacOS [15](https://www.apple.com/macos/macos-sequoia/)** +**Updated for MacOS [26](https://www.apple.com/os/macos/)** This guide describes how to build bitcoind, command-line utilities, and GUI on macOS. From 49a777d0dd0d28105b6ed397976fa8ba66960fea Mon Sep 17 00:00:00 2001 From: fanquake Date: Fri, 27 Feb 2026 11:38:38 +0000 Subject: [PATCH 10/10] doc: update release notes for v30.x --- doc/release-notes.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/release-notes.md b/doc/release-notes.md index f5d7d3976db..12eccd1ce58 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -46,11 +46,13 @@ Notable changes ### Net +- #34093 netif: fix compilation warning in QueryDefaultGatewayImpl() - #34549 net: reduce log level for PCP/NAT-PMP NOT_AUTHORIZED failures ### PSBT - #34272 psbt: Fix PSBTInputSignedAndVerified bounds assert +- #34219 psbt: validate pubkeys in MuSig2 pubnonce/partial sig deserialization ### Miniscript @@ -61,6 +63,8 @@ Notable changes - #34281 build: Temporarily remove confusing and brittle -fdebug-prefix-map - #34554 build: avoid exporting secp256k1 symbols - #34627 guix: use a temporary file over sponge, drop moreutils +- #34713 depends: Allow building Qt packages after interruption +- #34754 depends: Qt fixes for GCC 16 compatibility ### Test @@ -70,6 +74,11 @@ Notable changes - #34409 test: use ModuleNotFoundError in interface_ipc.py - #34445 fuzz: Use AFL_SHM_ID for naming test directories - #34608 test: Fix broken --valgrind handling after bitcoin wrapper +- #34690 test: Add missing timeout_factor to zmq socket + +### Util + +- #34597 util: Fix UB in SetStdinEcho when ENOTTY ### Doc @@ -78,6 +87,9 @@ Notable changes - #34510 doc: fix broken bpftrace installation link - #34561 wallet: rpc: manpage: fix example missing `fee_rate` argument - #34671 doc: Update Guix install for Debian/Ubuntu +- #34702 doc: Fix fee field in getblock RPC result +- #34706 doc: Improve dependencies.md IPC documentation +- #34789 doc: update build guides pre v31 ### CI @@ -102,9 +114,12 @@ Thanks to everyone who directly contributed to this release: - marcofleon - MarcoFalke - mzumsande +- nervana21 - Padraic Slattery +- ryanofsky - Sebastian Falbesoner - SomberNight +- tboy1337 - theuni - ToRyVand - willcl-ark