aboutsummaryrefslogtreecommitdiff
path: root/src/rpc/blockchain.cpp
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2019-05-01 12:24:55 -0400
committerMarcoFalke <falke.marco@gmail.com>2019-05-01 12:32:11 -0400
commitfab00a5cb90053e9671627af6a35e57610a44e89 (patch)
tree9a549153a12e1eb56fa61de80c90ec8ba268b879 /src/rpc/blockchain.cpp
parentfa1c3591add184ecb43eb3b149f4833f241e3858 (diff)
downloadbitcoin-fab00a5cb90053e9671627af6a35e57610a44e89.tar.xz
rpc: Serialize in getblock without cs_main
Diffstat (limited to 'src/rpc/blockchain.cpp')
-rw-r--r--src/rpc/blockchain.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index cd56e48ab8..cd636a7127 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -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;
@@ -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;
@@ -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;
@@ -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)
{
@@ -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