mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-19 18:09:47 +01:00
Merge #21043: net: Avoid UBSan warning in ProcessMessage(...)
3ddbf22ed1
util: Disallow negative mocktime (MarcoFalke)f5f2f97168
net: Avoid UBSan warning in ProcessMessage(...) (practicalswift) Pull request description: Avoid UBSan warning in `ProcessMessage(...)`. Context: https://github.com/bitcoin/bitcoin/pull/20380#issuecomment-770427182 (thanks Crypt-iQ!) ACKs for top commit: MarcoFalke: re-ACK3ddbf22ed1
only change is adding patch written by me ajtowns: ACK3ddbf22ed1
-- code review only Tree-SHA512: e8d7af0457ca86872b75a4e406c0a93aafd841c2962e244e147e748cc7ca118c56be0fdafe53765f4b291410030b2c3cc8f76f733b37a955d34fc885ab6037b9
This commit is contained in:
commit
685c16fcb2
@ -2489,6 +2489,9 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||
bool fRelay = true;
|
||||
|
||||
vRecv >> nVersion >> nServiceInt >> nTime >> addrMe;
|
||||
if (nTime < 0) {
|
||||
nTime = 0;
|
||||
}
|
||||
nServices = ServiceFlags(nServiceInt);
|
||||
if (!pfrom.IsInboundConn())
|
||||
{
|
||||
|
@ -365,13 +365,13 @@ static RPCHelpMan signmessagewithprivkey()
|
||||
static RPCHelpMan setmocktime()
|
||||
{
|
||||
return RPCHelpMan{"setmocktime",
|
||||
"\nSet the local time to given timestamp (-regtest only)\n",
|
||||
{
|
||||
{"timestamp", RPCArg::Type::NUM, RPCArg::Optional::NO, UNIX_EPOCH_TIME + "\n"
|
||||
" Pass 0 to go back to using the system time."},
|
||||
},
|
||||
RPCResult{RPCResult::Type::NONE, "", ""},
|
||||
RPCExamples{""},
|
||||
"\nSet the local time to given timestamp (-regtest only)\n",
|
||||
{
|
||||
{"timestamp", RPCArg::Type::NUM, RPCArg::Optional::NO, UNIX_EPOCH_TIME + "\n"
|
||||
"Pass 0 to go back to using the system time."},
|
||||
},
|
||||
RPCResult{RPCResult::Type::NONE, "", ""},
|
||||
RPCExamples{""},
|
||||
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
|
||||
{
|
||||
if (!Params().IsMockableChain()) {
|
||||
@ -386,7 +386,10 @@ static RPCHelpMan setmocktime()
|
||||
LOCK(cs_main);
|
||||
|
||||
RPCTypeCheck(request.params, {UniValue::VNUM});
|
||||
int64_t time = request.params[0].get_int64();
|
||||
const int64_t time{request.params[0].get_int64()};
|
||||
if (time < 0) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Mocktime can not be negative: %s.", time));
|
||||
}
|
||||
SetMockTime(time);
|
||||
if (request.context.Has<NodeContext>()) {
|
||||
for (const auto& chain_client : request.context.Get<NodeContext>().chain_clients) {
|
||||
|
@ -9,6 +9,8 @@
|
||||
|
||||
#include <util/time.h>
|
||||
|
||||
#include <util/check.h>
|
||||
|
||||
#include <atomic>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
#include <ctime>
|
||||
@ -18,7 +20,7 @@
|
||||
|
||||
void UninterruptibleSleep(const std::chrono::microseconds& n) { std::this_thread::sleep_for(n); }
|
||||
|
||||
static std::atomic<int64_t> nMockTime(0); //!< For unit testing
|
||||
static std::atomic<int64_t> nMockTime(0); //!< For testing
|
||||
|
||||
int64_t GetTime()
|
||||
{
|
||||
@ -46,6 +48,7 @@ template std::chrono::microseconds GetTime();
|
||||
|
||||
void SetMockTime(int64_t nMockTimeIn)
|
||||
{
|
||||
Assert(nMockTimeIn >= 0);
|
||||
nMockTime.store(nMockTimeIn, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ Test corresponds to code in rpc/server.cpp.
|
||||
import time
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import assert_raises_rpc_error
|
||||
|
||||
|
||||
class UptimeTest(BitcoinTestFramework):
|
||||
@ -18,8 +19,12 @@ class UptimeTest(BitcoinTestFramework):
|
||||
self.setup_clean_chain = True
|
||||
|
||||
def run_test(self):
|
||||
self._test_negative_time()
|
||||
self._test_uptime()
|
||||
|
||||
def _test_negative_time(self):
|
||||
assert_raises_rpc_error(-8, "Mocktime can not be negative: -1.", self.nodes[0].setmocktime, -1)
|
||||
|
||||
def _test_uptime(self):
|
||||
wait_time = 10
|
||||
self.nodes[0].setmocktime(int(time.time() + wait_time))
|
||||
|
Loading…
Reference in New Issue
Block a user