From 18d65d27726bf9fc7629b8e794047a10c9cf6156 Mon Sep 17 00:00:00 2001 From: stickies-v Date: Tue, 30 Jul 2024 17:30:59 +0100 Subject: [PATCH] test: use uint256::FromUserHex for RANDOM_CTX_SEED Removes dependency on unsafe and deprecated uint256S. This makes parsing more strict, by requiring RANDOM_CTX_SEED to be a string of up to 64 hex digits (optionally prefixed with "0x"), whereas previously any string would be accepted, with non-hex characters silently ignored and input longer than 64 characters (ignoring "0x" prefix) silently trimmed. Can be tested with: $ RANDOM_CTX_SEED=z ./src/test/test_bitcoin --log_level=all --run_test=timeoffsets_tests/timeoffsets_warning -- -printtoconsole=1 | grep RANDOM_CTX_SEED RANDOM_CTX_SEED must consist of up to 64 hex digits ("0x" prefix allowed), it was set to: 'z'. Co-Authored-By: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz> --- src/test/util/random.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/test/util/random.cpp b/src/test/util/random.cpp index 47d03055e28..8e0623ea064 100644 --- a/src/test/util/random.cpp +++ b/src/test/util/random.cpp @@ -7,9 +7,10 @@ #include #include #include +#include #include -#include +#include FastRandomContext g_insecure_rand_ctx; @@ -17,7 +18,7 @@ extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept; void SeedRandomForTest(SeedRand seedtype) { - static const std::string RANDOM_CTX_SEED{"RANDOM_CTX_SEED"}; + constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"}; // Do this once, on the first call, regardless of seedtype, because once // MakeRandDeterministicDANGEROUS is called, the output of GetRandHash is @@ -25,14 +26,20 @@ void SeedRandomForTest(SeedRand seedtype) // process. static const uint256 ctx_seed = []() { // If RANDOM_CTX_SEED is set, use that as seed. - const char* num = std::getenv(RANDOM_CTX_SEED.c_str()); - if (num) return uint256S(num); + if (const char* num{std::getenv(RANDOM_CTX_SEED)}) { + if (auto num_parsed{uint256::FromUserHex(num)}) { + return *num_parsed; + } else { + std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n"; + std::abort(); + } + } // Otherwise use a (truly) random value. return GetRandHash(); }(); const uint256& seed{seedtype == SeedRand::SEED ? ctx_seed : uint256::ZERO}; - LogPrintf("%s: Setting random seed for current tests to %s=%s\n", __func__, RANDOM_CTX_SEED, seed.GetHex()); + LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex()); MakeRandDeterministicDANGEROUS(seed); g_insecure_rand_ctx.Reseed(GetRandHash()); }