Skip to content

Commit

Permalink
Do not permit copying FastRandomContexts
Browse files Browse the repository at this point in the history
  • Loading branch information
sipa committed Dec 12, 2018
1 parent 022cf47 commit e414486
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/random.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -464,6 +464,20 @@ FastRandomContext::FastRandomContext(bool fDeterministic) : requires_seed(!fDete
rng.SetKey(seed.begin(), 32);
}

FastRandomContext& FastRandomContext::operator=(FastRandomContext&& from) noexcept
{
requires_seed = from.requires_seed;
rng = from.rng;
std::copy(std::begin(from.bytebuf), std::end(from.bytebuf), std::begin(bytebuf));
bytebuf_size = from.bytebuf_size;
bitbuf = from.bitbuf;
bitbuf_size = from.bitbuf_size;
from.requires_seed = true;
from.bytebuf_size = 0;
from.bitbuf_size = 0;
return *this;
}

void RandomInit()
{
RDRandInit();
Expand Down
8 changes: 8 additions & 0 deletions src/random.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ class FastRandomContext {
/** Initialize with explicit seed (only for testing) */
explicit FastRandomContext(const uint256& seed);

// Do not permit copying a FastRandomContext (move it, or create a new one to get reseeded).
FastRandomContext(const FastRandomContext&) = delete;
FastRandomContext(FastRandomContext&&) = delete;
FastRandomContext& operator=(const FastRandomContext&) = delete;

/** Move a FastRandomContext. If the original one is used again, it will be reseeded. */
FastRandomContext& operator=(FastRandomContext&& from) noexcept;

/** Generate a random 64-bit integer. */
uint64_t rand64()
{
Expand Down

0 comments on commit e414486

Please sign in to comment.