Skip to content

Commit

Permalink
rpc: Serialize in getblock without cs_main
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcoFalke committed May 1, 2019
1 parent fa1c359 commit fab00a5
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions src/rpc/blockchain.cpp
Expand Up @@ -93,6 +93,7 @@ static int ComputeNextBlockAndDepth(const CBlockIndex* tip, const CBlockIndex* b

UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex)
{
// Serialize passed information without accessing chain state of the active chain!
UniValue result(UniValue::VOBJ);
result.pushKV("hash", blockindex->GetBlockHash().GetHex());
const CBlockIndex* pnext;
Expand All @@ -119,6 +120,7 @@ UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex

UniValue blockToJSON(const CBlock& block, const CBlockIndex* tip, const CBlockIndex* blockindex, bool txDetails)
{
// Serialize passed information without accessing chain state of the active chain!
UniValue result(UniValue::VOBJ);
result.pushKV("hash", blockindex->GetBlockHash().GetHex());
const CBlockIndex* pnext;
Expand Down Expand Up @@ -882,8 +884,6 @@ static UniValue getblock(const JSONRPCRequest& request)
throw std::runtime_error(help.ToString());
}

LOCK(cs_main);

uint256 hash(ParseHashV(request.params[0], "blockhash"));

int verbosity = 1;
Expand All @@ -894,12 +894,20 @@ static UniValue getblock(const JSONRPCRequest& request)
verbosity = request.params[1].get_bool() ? 1 : 0;
}

const CBlockIndex* pblockindex = LookupBlockIndex(hash);
if (!pblockindex) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
}
CBlock block;
const CBlockIndex* pblockindex;
const CBlockIndex* tip;
{
LOCK(cs_main);
pblockindex = LookupBlockIndex(hash);
tip = chainActive.Tip();

if (!pblockindex) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
}

const CBlock block = GetBlockChecked(pblockindex);
block = GetBlockChecked(pblockindex);
}

if (verbosity <= 0)
{
Expand All @@ -909,7 +917,7 @@ static UniValue getblock(const JSONRPCRequest& request)
return strHex;
}

return blockToJSON(block, chainActive.Tip(), pblockindex, verbosity >= 2);
return blockToJSON(block, tip, pblockindex, verbosity >= 2);
}

struct CCoinsStats
Expand Down

0 comments on commit fab00a5

Please sign in to comment.