From d1fc4d95afc191072fc650581a9b668b68b47b15 Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Wed, 4 Apr 2018 18:06:00 +1000 Subject: [PATCH] ArgsManager: limit some options to only apply on mainnet when in default section When specified in bitcoin.conf without using the [regtest] or [test] section header, or a "regtest." or "test." prefix, the "addnode", "connect", "port", "bind", "rpcport", "rpcbind", and "wallet" settings will only be applied when running on mainnet. --- src/util.cpp | 38 ++++++++++++++++++++++++++++++++++---- src/util.h | 5 +++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 85c3d221afa..51c28349f39 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -460,6 +460,13 @@ class ArgsManagerHelper { public: typedef std::map> MapArgs; + /** Determine whether to use config settings in the default section, + * See also comments around ArgsManager::ArgsManager() below. */ + static inline bool UseDefaultSection(const ArgsManager& am, const std::string& arg) + { + return (am.m_network == CBaseChainParams::MAIN || am.m_network_only_args.count(arg) == 0); + } + /** Convert regular argument into the network-specific setting */ static inline std::string NetworkArg(const ArgsManager& am, const std::string& arg) { @@ -521,9 +528,11 @@ public: } } - found_result = GetArgHelper(am.m_config_args, arg); - if (found_result.first) { - return found_result; + if (UseDefaultSection(am, arg)) { + found_result = GetArgHelper(am.m_config_args, arg); + if (found_result.first) { + return found_result; + } } return found_result; @@ -575,6 +584,22 @@ static bool InterpretNegatedOption(std::string& key, std::string& val) return false; } +ArgsManager::ArgsManager() : + /* These options would cause cross-contamination if values for + * mainnet were used while running on regtest/testnet (or vice-versa). + * Setting them as section_only_args ensures that sharing a config file + * between mainnet and regtest/testnet won't cause problems due to these + * parameters by accident. */ + m_network_only_args{ + "-addnode", "-connect", + "-port", "-bind", + "-rpcport", "-rpcbind", + "-wallet", + } +{ + // nothing to do +} + void ArgsManager::SelectConfigNetwork(const std::string& network) { m_network = network; @@ -621,11 +646,16 @@ std::vector ArgsManager::GetArgs(const std::string& strArg) const if (IsArgNegated(strArg)) return result; // special case LOCK(cs_args); + ArgsManagerHelper::AddArgs(result, m_override_args, strArg); if (!m_network.empty()) { ArgsManagerHelper::AddArgs(result, m_config_args, ArgsManagerHelper::NetworkArg(*this, strArg)); } - ArgsManagerHelper::AddArgs(result, m_config_args, strArg); + + if (ArgsManagerHelper::UseDefaultSection(*this, strArg)) { + ArgsManagerHelper::AddArgs(result, m_config_args, strArg); + } + return result; } diff --git a/src/util.h b/src/util.h index ca6523ab14f..8132435628f 100644 --- a/src/util.h +++ b/src/util.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -229,9 +230,13 @@ protected: std::map> m_override_args; std::map> m_config_args; std::string m_network; + std::set m_network_only_args; + void ReadConfigStream(std::istream& stream); public: + ArgsManager(); + /** * Select the network in use */