kernel: SanityChecks: Return an error struct

This reduces libbitcoinkernel's coupling with ui_interface and
translation.
This commit is contained in:
Carl Dong
2022-05-25 18:02:54 -04:00
parent 265d6393bf
commit d87784ac87
4 changed files with 31 additions and 12 deletions

View File

@ -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 // 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 // things instantiated so far requires running the epilogue to be torn down
// properly // properly
assert(kernel::SanityChecks(kernel_context)); assert(!kernel::SanityChecks(kernel_context).has_value());
// Necessary for CheckInputScripts (eventually called by ProcessNewBlock), // Necessary for CheckInputScripts (eventually called by ProcessNewBlock),
// which will try the script cache first and fall back to actually // which will try the script cache first and fall back to actually

View File

@ -1094,7 +1094,21 @@ static bool LockDataDirectory(bool probeOnly)
bool AppInitSanityChecks(const kernel::Context& kernel) bool AppInitSanityChecks(const kernel::Context& kernel)
{ {
// ********************************************************* Step 4: sanity checks // ********************************************************* 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)); return InitError(strprintf(_("Initialization sanity check failed. %s is shutting down."), PACKAGE_NAME));
} }

View File

@ -5,29 +5,26 @@
#include <kernel/checks.h> #include <kernel/checks.h>
#include <key.h> #include <key.h>
#include <node/ui_interface.h>
#include <random.h> #include <random.h>
#include <util/time.h> #include <util/time.h>
#include <util/translation.h>
#include <memory>
namespace kernel { namespace kernel {
bool SanityChecks(const Context&) { std::optional<SanityCheckError> SanityChecks(const Context&)
{
if (!ECC_InitSanityCheck()) { if (!ECC_InitSanityCheck()) {
return InitError(Untranslated("Elliptic curve cryptography sanity check failure. Aborting.")); return SanityCheckError::ERROR_ECC;
} }
if (!Random_SanityCheck()) { if (!Random_SanityCheck()) {
return InitError(Untranslated("OS cryptographic RNG sanity check failure. Aborting.")); return SanityCheckError::ERROR_RANDOM;
} }
if (!ChronoSanityCheck()) { if (!ChronoSanityCheck()) {
return InitError(Untranslated("Clock epoch mismatch. Aborting.")); return SanityCheckError::ERROR_CHRONO;
} }
return true; return std::nullopt;
} }
} }

View File

@ -5,14 +5,22 @@
#ifndef BITCOIN_KERNEL_CHECKS_H #ifndef BITCOIN_KERNEL_CHECKS_H
#define BITCOIN_KERNEL_CHECKS_H #define BITCOIN_KERNEL_CHECKS_H
#include <optional>
namespace kernel { namespace kernel {
struct Context; struct Context;
enum class SanityCheckError {
ERROR_ECC,
ERROR_RANDOM,
ERROR_CHRONO,
};
/** /**
* Ensure a usable environment with all necessary library support. * Ensure a usable environment with all necessary library support.
*/ */
bool SanityChecks(const Context&); std::optional<SanityCheckError> SanityChecks(const Context&);
} }