Bug-fix: listsinceblock: use closest common ancestor when a block hash was provided for a chain that was not the main chain.

This commit is contained in:
Karl-Johan Alm 2017-01-11 15:31:16 +09:00
parent 6696b4635c
commit ee5c1ce5a6
1 changed files with 14 additions and 4 deletions

View File

@ -1679,7 +1679,7 @@ UniValue listsinceblock(const JSONRPCRequest& request)
LOCK2(cs_main, pwalletMain->cs_wallet); LOCK2(cs_main, pwalletMain->cs_wallet);
CBlockIndex *pindex = NULL; const CBlockIndex *pindex = NULL;
int target_confirms = 1; int target_confirms = 1;
isminefilter filter = ISMINE_SPENDABLE; isminefilter filter = ISMINE_SPENDABLE;
@ -1690,7 +1690,16 @@ UniValue listsinceblock(const JSONRPCRequest& request)
blockId.SetHex(request.params[0].get_str()); blockId.SetHex(request.params[0].get_str());
BlockMap::iterator it = mapBlockIndex.find(blockId); BlockMap::iterator it = mapBlockIndex.find(blockId);
if (it != mapBlockIndex.end()) if (it != mapBlockIndex.end())
{
pindex = it->second; pindex = it->second;
if (chainActive[pindex->nHeight] != pindex)
{
// the block being asked for is a part of a deactivated chain;
// we don't want to depend on its perceived height in the block
// chain, we want to instead use the last common ancestor
pindex = chainActive.FindFork(pindex);
}
}
} }
if (request.params.size() > 1) if (request.params.size() > 1)
@ -1701,9 +1710,10 @@ UniValue listsinceblock(const JSONRPCRequest& request)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter"); throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter");
} }
if(request.params.size() > 2) if (request.params.size() > 2 && request.params[2].get_bool())
if(request.params[2].get_bool()) {
filter = filter | ISMINE_WATCH_ONLY; filter = filter | ISMINE_WATCH_ONLY;
}
int depth = pindex ? (1 + chainActive.Height() - pindex->nHeight) : -1; int depth = pindex ? (1 + chainActive.Height() - pindex->nHeight) : -1;