rpc: fix getrawtransaction segfault

The crash would happen when querying a mempool transaction with verbosity=2, while pruning.
This commit is contained in:
Martin Zumsande 2023-12-05 13:07:39 -05:00
parent 6d5790956f
commit 494a926d05

View file

@ -396,7 +396,7 @@ static RPCHelpMan getrawtransaction()
LOCK(cs_main); LOCK(cs_main);
blockindex = chainman.m_blockman.LookupBlockIndex(hash_block); blockindex = chainman.m_blockman.LookupBlockIndex(hash_block);
} }
if (verbosity == 1) { if (verbosity == 1 || !blockindex) {
TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate()); TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
return result; return result;
} }
@ -405,8 +405,7 @@ static RPCHelpMan getrawtransaction()
CBlock block; CBlock block;
const bool is_block_pruned{WITH_LOCK(cs_main, return chainman.m_blockman.IsBlockPruned(blockindex))}; const bool is_block_pruned{WITH_LOCK(cs_main, return chainman.m_blockman.IsBlockPruned(blockindex))};
if (tx->IsCoinBase() || if (tx->IsCoinBase() || is_block_pruned ||
!blockindex || is_block_pruned ||
!(chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex) && chainman.m_blockman.ReadBlockFromDisk(block, *blockindex))) { !(chainman.m_blockman.UndoReadFromDisk(blockUndo, *blockindex) && chainman.m_blockman.ReadBlockFromDisk(block, *blockindex))) {
TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate()); TxToJSON(*tx, hash_block, result, chainman.ActiveChainstate());
return result; return result;