Browse Source

Merge pull request #6007

eb63bf8 Fix missing lock in submitblock (Matt Corallo)
0.13
Wladimir J. van der Laan 10 years ago
parent
commit
d3eb5ae46a
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 23
      src/rpcmining.cpp

23
src/rpcmining.cpp

@ -629,14 +629,19 @@ Value submitblock(const Array& params, bool fHelp) @@ -629,14 +629,19 @@ Value submitblock(const Array& params, bool fHelp)
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
uint256 hash = block.GetHash();
BlockMap::iterator mi = mapBlockIndex.find(hash);
if (mi != mapBlockIndex.end()) {
CBlockIndex *pindex = mi->second;
if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
return "duplicate";
if (pindex->nStatus & BLOCK_FAILED_MASK)
return "duplicate-invalid";
// Otherwise, we might only have the header - process the block before returning
bool fBlockPresent = false;
{
LOCK(cs_main);
BlockMap::iterator mi = mapBlockIndex.find(hash);
if (mi != mapBlockIndex.end()) {
CBlockIndex *pindex = mi->second;
if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
return "duplicate";
if (pindex->nStatus & BLOCK_FAILED_MASK)
return "duplicate-invalid";
// Otherwise, we might only have the header - process the block before returning
fBlockPresent = true;
}
}
CValidationState state;
@ -644,7 +649,7 @@ Value submitblock(const Array& params, bool fHelp) @@ -644,7 +649,7 @@ Value submitblock(const Array& params, bool fHelp)
RegisterValidationInterface(&sc);
bool fAccepted = ProcessNewBlock(state, NULL, &block);
UnregisterValidationInterface(&sc);
if (mi != mapBlockIndex.end())
if (fBlockPresent)
{
if (fAccepted && !sc.found)
return "duplicate-inconclusive";

Loading…
Cancel
Save