Merge #9743: Fix several potential issues found by sanitizers

1d31093 fix tsan: utiltime race on nMockTime (Pieter Wuille)
321bbc2 fix ubsan: bitcoin-tx: not initialize context before IsFullyValid (Pieter Wuille)

Tree-SHA512: 39ea83c6122f06339cd425deb236357694e84ce2e4e9c61c10b90a8909b6e42e8c7b76396175cdc4723ababd2fa4f935d48f8a469baf853c5a06d7b962a5c8dc
This commit is contained in:
Wladimir J. van der Laan 2017-04-26 12:24:48 +02:00
commit 6fdb319165
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
2 changed files with 13 additions and 7 deletions

View File

@ -657,11 +657,13 @@ static void MutateTx(CMutableTransaction& tx, const std::string& command,
MutateTxDelOutput(tx, commandVal); MutateTxDelOutput(tx, commandVal);
else if (command == "outaddr") else if (command == "outaddr")
MutateTxAddOutAddr(tx, commandVal); MutateTxAddOutAddr(tx, commandVal);
else if (command == "outpubkey") else if (command == "outpubkey") {
if (!ecc) { ecc.reset(new Secp256k1Init()); }
MutateTxAddOutPubKey(tx, commandVal); MutateTxAddOutPubKey(tx, commandVal);
else if (command == "outmultisig") } else if (command == "outmultisig") {
if (!ecc) { ecc.reset(new Secp256k1Init()); }
MutateTxAddOutMultiSig(tx, commandVal); MutateTxAddOutMultiSig(tx, commandVal);
else if (command == "outscript") } else if (command == "outscript")
MutateTxAddOutScript(tx, commandVal); MutateTxAddOutScript(tx, commandVal);
else if (command == "outdata") else if (command == "outdata")
MutateTxAddOutData(tx, commandVal); MutateTxAddOutData(tx, commandVal);

View File

@ -9,14 +9,17 @@
#include "utiltime.h" #include "utiltime.h"
#include <atomic>
#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread.hpp> #include <boost/thread.hpp>
static int64_t nMockTime = 0; //!< For unit testing static std::atomic<int64_t> nMockTime(0); //!< For unit testing
int64_t GetTime() int64_t GetTime()
{ {
if (nMockTime) return nMockTime; int64_t mocktime = nMockTime.load(std::memory_order_relaxed);
if (mocktime) return mocktime;
time_t now = time(NULL); time_t now = time(NULL);
assert(now > 0); assert(now > 0);
@ -25,7 +28,7 @@ int64_t GetTime()
void SetMockTime(int64_t nMockTimeIn) void SetMockTime(int64_t nMockTimeIn)
{ {
nMockTime = nMockTimeIn; nMockTime.store(nMockTimeIn, std::memory_order_relaxed);
} }
int64_t GetTimeMillis() int64_t GetTimeMillis()
@ -52,7 +55,8 @@ int64_t GetSystemTimeInSeconds()
/** Return a time useful for the debug log */ /** Return a time useful for the debug log */
int64_t GetLogTimeMicros() int64_t GetLogTimeMicros()
{ {
if (nMockTime) return nMockTime*1000000; int64_t mocktime = nMockTime.load(std::memory_order_relaxed);
if (mocktime) return mocktime*1000000;
return GetTimeMicros(); return GetTimeMicros();
} }