Skip to content

Commit 3f3c4d2

Browse files
committed
Merge bitcoin/bitcoin#22002: Fix crash when parsing command line with -noincludeconf=0
fad0867 Cleanup -includeconf error message (MarcoFalke) fa9f711 Fix crash when parsing command line with -noincludeconf=0 (MarcoFalke) Pull request description: The error message has several issues: * It may crash instead of cleanly shutting down, when `-noincludeconf=0` is passed * It doesn't quote the value * It includes an erroneous trailing `\n` * It is redundantly mentioning `"-includeconf cannot be used from commandline;"` several times, when once should be more than sufficient Fix all issues by: * Replacing `get_str()` with `write()` to fix the crash and quoting issue * Remove the `\n` and only print the first value to fix the other issues Before: ``` $ ./src/bitcoind -noincludeconf=0 terminate called after throwing an instance of 'std::runtime_error' what(): JSON value is not a string as expected Aborted (core dumped) $ ./src/bitcoind -includeconf='a b' -includeconf=c Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf=a b -includeconf cannot be used from commandline; -includeconf=c ``` After: ``` $ ./src/bitcoind -noincludeconf=0 Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf=true $ ./src/bitcoind -includeconf='a b' -includeconf=c Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf="a b" ``` Hopefully fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=34493 Testcase: https://github.com/bitcoin/bitcoin/files/6515429/clusterfuzz-testcase-minimized-system-6328535926046720.log ``` FUZZ=system ./src/test/fuzz/fuzz ./clusterfuzz-testcase-minimized-system-6328535926046720.log ``` See https://github.com/bitcoin/bitcoin/blob/master/doc/fuzzing.md ACKs for top commit: sipa: utACK fad0867 Tree-SHA512: b44af93be6bf71b43669058c1449c4c6999f03b5b01b429851b149b12d77733408cb207e9a3edc6f0bffd6030c4c52165e8e23a1c2718ff5082a6ba254cc94a4
2 parents be41716 + fad0867 commit 3f3c4d2

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

src/util/system.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,14 +366,12 @@ bool ArgsManager::ParseParameters(int argc, const char* const argv[], std::strin
366366
}
367367

368368
// we do not allow -includeconf from command line
369-
bool success = true;
370369
if (auto* includes = util::FindKey(m_settings.command_line_options, "includeconf")) {
371-
for (const auto& include : util::SettingsSpan(*includes)) {
372-
error += "-includeconf cannot be used from commandline; -includeconf=" + include.get_str() + "\n";
373-
success = false;
374-
}
370+
const auto& include{*util::SettingsSpan(*includes).begin()}; // pick first value as example
371+
error = "-includeconf cannot be used from commandline; -includeconf=" + include.write();
372+
return false;
375373
}
376-
return success;
374+
return true;
377375
}
378376

379377
std::optional<unsigned int> ArgsManager::GetArgFlags(const std::string& name) const

test/functional/feature_includeconf.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,14 @@ def run_test(self):
4242

4343
self.log.info("-includeconf cannot be used as command-line arg")
4444
self.stop_node(0)
45-
self.nodes[0].assert_start_raises_init_error(extra_args=["-includeconf=relative2.conf"], expected_msg="Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf=relative2.conf")
45+
self.nodes[0].assert_start_raises_init_error(
46+
extra_args=['-noincludeconf=0'],
47+
expected_msg='Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf=true',
48+
)
49+
self.nodes[0].assert_start_raises_init_error(
50+
extra_args=['-includeconf=relative2.conf', '-includeconf=no_warn.conf'],
51+
expected_msg='Error: Error parsing command line arguments: -includeconf cannot be used from commandline; -includeconf="relative2.conf"',
52+
)
4653

4754
self.log.info("-includeconf cannot be used recursively. subversion should end with 'main; relative)/'")
4855
with open(os.path.join(self.options.tmpdir, "node0", "relative.conf"), "a", encoding="utf8") as f:

0 commit comments

Comments
 (0)