From d8926263b78f1563f0698cd228a7d38fa9580bd2 Mon Sep 17 00:00:00 2001 From: practicalswift Date: Mon, 6 Nov 2017 23:20:43 +0100 Subject: [PATCH] Add missing cs_main locks when calling blockToJSON/blockheaderToJSON zcash: cherry picked from commit a9b6ba0b7cd27a64307987afaab7f60bf9b4a15b zcash: https://github.com/bitcoin/bitcoin/pull/11618 --- src/rest.cpp | 13 ++++++++++--- src/rpc/blockchain.cpp | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/rest.cpp b/src/rest.cpp index 225fec52f..0853665ea 100644 --- a/src/rest.cpp +++ b/src/rest.cpp @@ -173,8 +173,11 @@ static bool rest_headers(HTTPRequest* req, } case RF_JSON: { UniValue jsonHeaders(UniValue::VARR); - for (const CBlockIndex *pindex : headers) { - jsonHeaders.push_back(blockheaderToJSON(pindex)); + { + LOCK(cs_main); + for (const CBlockIndex *pindex : headers) { + jsonHeaders.push_back(blockheaderToJSON(pindex)); + } } string strJSON = jsonHeaders.write() + "\n"; req->WriteHeader("Content-Type", "application/json"); @@ -238,7 +241,11 @@ static bool rest_block(HTTPRequest* req, } case RF_JSON: { - UniValue objBlock = blockToJSON(block, pblockindex, showTxDetails); + UniValue objBlock; + { + LOCK(cs_main); + objBlock = blockToJSON(block, pblockindex, showTxDetails); + } string strJSON = objBlock.write() + "\n"; req->WriteHeader("Content-Type", "application/json"); req->WriteReply(HTTP_OK, strJSON); diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index e4ba5ca84..5930b7a7e 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -103,6 +103,7 @@ static UniValue ValuePoolDesc( UniValue blockheaderToJSON(const CBlockIndex* blockindex) { + AssertLockHeld(cs_main); UniValue result(UniValue::VOBJ); result.pushKV("hash", blockindex->GetBlockHash().GetHex()); int confirmations = -1; @@ -220,6 +221,7 @@ UniValue blockToDeltasJSON(const CBlock& block, const CBlockIndex* blockindex) UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false) { + AssertLockHeld(cs_main); UniValue result(UniValue::VOBJ); result.pushKV("hash", block.GetHash().GetHex()); int confirmations = -1;