aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2015-04-13 17:55:41 +0100
committerMatt Corallo <git@bluematt.me>2015-04-13 11:29:44 -0700
commiteb63bf86cf6dc99f150574463df6ffb013a34493 (patch)
tree488727fec0231a10501e62ae541e6d55236b3a4e
parent9125c08f3468928eba004636bd95494a94e1a82b (diff)
downloadbitcoin-eb63bf86cf6dc99f150574463df6ffb013a34493.tar.xz
Fix missing lock in submitblock
-rw-r--r--src/rpcmining.cpp23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp
index 1e6531f68a..949fe3ed52 100644
--- a/src/rpcmining.cpp
+++ b/src/rpcmining.cpp
@@ -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)
RegisterValidationInterface(&sc);
bool fAccepted = ProcessNewBlock(state, NULL, &block);
UnregisterValidationInterface(&sc);
- if (mi != mapBlockIndex.end())
+ if (fBlockPresent)
{
if (fAccepted && !sc.found)
return "duplicate-inconclusive";