From facfde2cdce661c10be3254a6be99af49ceee072 Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Sat, 23 Aug 2025 11:31:59 +0200 Subject: [PATCH 1/2] test: Fix CLI_MAX_ARG_SIZE issues --- test/functional/rpc_misc.py | 7 +++++++ test/functional/test_framework/test_node.py | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/test/functional/rpc_misc.py b/test/functional/rpc_misc.py index 3c7cce2f168..f8384e5b413 100755 --- a/test/functional/rpc_misc.py +++ b/test/functional/rpc_misc.py @@ -30,6 +30,13 @@ class RpcMiscTest(BitcoinTestFramework): lambda: node.echo(arg9='trigger_internal_bug'), ) + self.log.info("test max arg size") + ARG_SZ_COMMON = 131071 # Common limit, used previously in the test framework, serves as a regression test + ARG_SZ_LARGE = 8 * 1024 * 1024 # A large size, which should be rare to hit in practice + for arg_sz in [0, 1, 100, ARG_SZ_COMMON, ARG_SZ_LARGE]: + arg_string = 'a' * arg_sz + assert_equal([arg_string, arg_string], node.echo(arg_string, arg_string)) + self.log.info("test getmemoryinfo") memory = node.getmemoryinfo()['locked'] assert_greater_than(memory['used'], 0) diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index 3b0814635aa..be9116dec1c 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -46,7 +46,12 @@ BITCOIND_PROC_WAIT_TIMEOUT = 60 # The size of the blocks xor key # from InitBlocksdirXorKey::xor_key.size() NUM_XOR_BYTES = 8 -CLI_MAX_ARG_SIZE = 131071 # many systems have a 128kb limit per arg (MAX_ARG_STRLEN) +# Many systems have a 128kB limit for a command size. Depending on the +# platform, this limit may be larger or smaller. Moreover, when using the +# 'bitcoin' command, it may internally insert more args, which must be +# accounted for. There is no need to pick the largest possible value here +# anyway and it should be fine to set it to 1kB in tests. +TEST_CLI_MAX_ARG_SIZE = 1024 # The null blocks key (all 0s) NULL_BLK_XOR_KEY = bytes([0] * NUM_XOR_BYTES) @@ -928,10 +933,14 @@ class TestNodeCLI(): if clicommand is not None: p_args += [clicommand] p_args += pos_args + named_args - max_arg_size = max(len(arg) for arg in p_args) + + # TEST_CLI_MAX_ARG_SIZE is set low enough that checking the string + # length is enough and encoding to bytes is not needed before + # calculating the sum. + sum_arg_size = sum(len(arg) for arg in p_args) stdin_data = self.input - if max_arg_size > CLI_MAX_ARG_SIZE: - self.log.debug(f"Cli: Command size {max_arg_size} too large, using stdin") + if sum_arg_size >= TEST_CLI_MAX_ARG_SIZE: + self.log.debug(f"Cli: Command size {sum_arg_size} too large, using stdin") rpc_args = "\n".join([arg for arg in p_args[base_arg_pos:]]) if stdin_data is not None: stdin_data += "\n" + rpc_args From fa96a4afea2a9bf90c843198e75a00acef02c32d Mon Sep 17 00:00:00 2001 From: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> Date: Sat, 23 Aug 2025 11:31:07 +0200 Subject: [PATCH 2/2] ci: Enable CI_LIMIT_STACK_SIZE=1 in i686_no_ipc task --- ci/test/00_setup_env_i686_no_ipc.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/test/00_setup_env_i686_no_ipc.sh b/ci/test/00_setup_env_i686_no_ipc.sh index 5ab41437225..4da38d9bb99 100755 --- a/ci/test/00_setup_env_i686_no_ipc.sh +++ b/ci/test/00_setup_env_i686_no_ipc.sh @@ -13,6 +13,7 @@ export CI_IMAGE_PLATFORM="linux/amd64" export PACKAGES="llvm clang g++-multilib" export DEP_OPTS="DEBUG=1 NO_IPC=1" export GOAL="install" +export CI_LIMIT_STACK_SIZE=1 export TEST_RUNNER_EXTRA="--v2transport --usecli" export BITCOIN_CONFIG="\ -DCMAKE_BUILD_TYPE=Debug \