diff options
-rw-r--r-- | src/bitcoin-chainstate.cpp | 2 | ||||
-rw-r--r-- | src/init.cpp | 16 | ||||
-rw-r--r-- | src/kernel/checks.cpp | 15 | ||||
-rw-r--r-- | src/kernel/checks.h | 10 |
4 files changed, 31 insertions, 12 deletions
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp index 3f2b298c1f..1817aa1a53 100644 --- a/src/bitcoin-chainstate.cpp +++ b/src/bitcoin-chainstate.cpp @@ -56,7 +56,7 @@ int main(int argc, char* argv[]) // We can't use a goto here, but we can use an assert since none of the // things instantiated so far requires running the epilogue to be torn down // properly - assert(kernel::SanityChecks(kernel_context)); + assert(!kernel::SanityChecks(kernel_context).has_value()); // Necessary for CheckInputScripts (eventually called by ProcessNewBlock), // which will try the script cache first and fall back to actually diff --git a/src/init.cpp b/src/init.cpp index 108f5c99d3..d0fd6074b1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1094,7 +1094,21 @@ static bool LockDataDirectory(bool probeOnly) bool AppInitSanityChecks(const kernel::Context& kernel) { // ********************************************************* Step 4: sanity checks - if (!kernel::SanityChecks(kernel)) { + auto maybe_error = kernel::SanityChecks(kernel); + + if (maybe_error.has_value()) { + switch (maybe_error.value()) { + case kernel::SanityCheckError::ERROR_ECC: + InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting.")); + break; + case kernel::SanityCheckError::ERROR_RANDOM: + InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting.")); + break; + case kernel::SanityCheckError::ERROR_CHRONO: + InitError(Untranslated("Clock epoch mismatch. Aborting.")); + break; + } // no default case, so the compiler can warn about missing cases + return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME)); } diff --git a/src/kernel/checks.cpp b/src/kernel/checks.cpp index a25617bea5..2a1dd3bfa2 100644 --- a/src/kernel/checks.cpp +++ b/src/kernel/checks.cpp @@ -5,29 +5,26 @@ #include <kernel/checks.h> #include <key.h> -#include <node/ui_interface.h> #include <random.h> #include <util/time.h> -#include <util/translation.h> - -#include <memory> namespace kernel { -bool SanityChecks(const Context&) { +std::optional<SanityCheckError> SanityChecks(const Context&) +{ if (!ECC_InitSanityCheck()) { - return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting.")); + return SanityCheckError::ERROR_ECC; } if (!Random_SanityCheck()) { - return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting.")); + return SanityCheckError::ERROR_RANDOM; } if (!ChronoSanityCheck()) { - return InitError(Untranslated("Clock epoch mismatch. Aborting.")); + return SanityCheckError::ERROR_CHRONO; } - return true; + return std::nullopt; } } diff --git a/src/kernel/checks.h b/src/kernel/checks.h index 786281fa2c..80b207f607 100644 --- a/src/kernel/checks.h +++ b/src/kernel/checks.h @@ -5,14 +5,22 @@ #ifndef BITCOIN_KERNEL_CHECKS_H #define BITCOIN_KERNEL_CHECKS_H +#include <optional> + namespace kernel { struct Context; +enum class SanityCheckError { + ERROR_ECC, + ERROR_RANDOM, + ERROR_CHRONO, +}; + /** * Ensure a usable environment with all necessary library support. */ -bool SanityChecks(const Context&); +std::optional<SanityCheckError> SanityChecks(const Context&); } |