Merge pull request #6007

eb63bf8 Fix missing lock in submitblock (Matt Corallo)
This commit is contained in:
Wladimir J. van der Laan 2015-04-14 10:49:13 +02:00
commit d3eb5ae46a
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
1 changed files with 14 additions and 9 deletions

View File

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