In listaddressgroupings push down the IsMine check to run on each input.
This avoids a potential crash when trying to read the scrippubkeys on transactions where the first input IsMine but some of the rest are not when running listaddressgroupings.
This commit is contained in:
parent
14ac0adcc7
commit
a3fad2119b
1 changed files with 21 additions and 12 deletions
|
@ -1664,29 +1664,38 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
|
|||
{
|
||||
CWalletTx *pcoin = &walletEntry.second;
|
||||
|
||||
if (pcoin->vin.size() > 0 && IsMine(pcoin->vin[0]))
|
||||
if (pcoin->vin.size() > 0)
|
||||
{
|
||||
bool any_mine = false;
|
||||
// group all input addresses with each other
|
||||
BOOST_FOREACH(CTxIn txin, pcoin->vin)
|
||||
{
|
||||
CTxDestination address;
|
||||
if(!IsMine(txin)) /* If this input isn't mine, ignore it */
|
||||
continue;
|
||||
if(!ExtractDestination(mapWallet[txin.prevout.hash].vout[txin.prevout.n].scriptPubKey, address))
|
||||
continue;
|
||||
grouping.insert(address);
|
||||
any_mine = true;
|
||||
}
|
||||
|
||||
// group change with input addresses
|
||||
BOOST_FOREACH(CTxOut txout, pcoin->vout)
|
||||
if (IsChange(txout))
|
||||
{
|
||||
CWalletTx tx = mapWallet[pcoin->vin[0].prevout.hash];
|
||||
CTxDestination txoutAddr;
|
||||
if(!ExtractDestination(txout.scriptPubKey, txoutAddr))
|
||||
continue;
|
||||
grouping.insert(txoutAddr);
|
||||
}
|
||||
groupings.insert(grouping);
|
||||
grouping.clear();
|
||||
if (any_mine)
|
||||
{
|
||||
BOOST_FOREACH(CTxOut txout, pcoin->vout)
|
||||
if (IsChange(txout))
|
||||
{
|
||||
CTxDestination txoutAddr;
|
||||
if(!ExtractDestination(txout.scriptPubKey, txoutAddr))
|
||||
continue;
|
||||
grouping.insert(txoutAddr);
|
||||
}
|
||||
}
|
||||
if (grouping.size() > 0)
|
||||
{
|
||||
groupings.insert(grouping);
|
||||
grouping.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// group lone addrs by themselves
|
||||
|
|
Loading…
Reference in a new issue