Skip to content

Commit

Permalink
Merge pull request #890 from jagerman/wallet-segfault
Browse files Browse the repository at this point in the history
Simplified get_transfers and fixed sort segfault
  • Loading branch information
Doy-lee committed Oct 10, 2019
2 parents 0bf62d0 + 8150010 commit 6716f7f
Showing 1 changed file with 12 additions and 35 deletions.
47 changes: 12 additions & 35 deletions src/wallet/wallet2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5947,45 +5947,22 @@ void wallet2::get_transfers(get_transfers_args_t args, std::vector<transfer_view

// Fill transfers
transfers.reserve(size);
if (args.in)
{
for (auto i = in.cbegin(); i != in.cend(); ++i)
{
transfers.push_back(make_transfer_view(i->second.m_tx_hash, i->first, i->second));
}
}

if (args.out)
for (const auto &i : in)
transfers.push_back(make_transfer_view(i.second.m_tx_hash, i.first, i.second));
for (const auto &o : out)
transfers.push_back(make_transfer_view(o.first, o.second));
for (const auto &pof : pending_or_failed)
{
for (std::list<std::pair<crypto::hash, tools::wallet2::confirmed_transfer_details>>::const_iterator i = out.begin(); i != out.end(); ++i)
{
transfers.push_back(make_transfer_view(i->first, i->second));
}
}

if (args.pending || args.failed)
{
for (std::list<std::pair<crypto::hash, tools::wallet2::unconfirmed_transfer_details>>::const_iterator i = pending_or_failed.begin(); i != pending_or_failed.end(); ++i)
{
const wallet2::unconfirmed_transfer_details &pd = i->second;
bool is_failed = pd.m_state == tools::wallet2::unconfirmed_transfer_details::failed;
if (!((args.failed && is_failed) || (!is_failed && args.pending)))
continue;
transfers.push_back(make_transfer_view(i->first, i->second));
}
}

if (args.pool)
{
for (std::list<std::pair<crypto::hash, tools::wallet2::pool_payment_details>>::const_iterator i = pool.begin(); i != pool.end(); ++i)
{
transfers.push_back(make_transfer_view(i->first, i->second));
}
bool is_failed = pof.second.m_state == tools::wallet2::unconfirmed_transfer_details::failed;
if (is_failed ? args.failed : args.pending)
transfers.push_back(make_transfer_view(pof.first, pof.second));
}
for (const auto &p : pool)
transfers.push_back(make_transfer_view(p.first, p.second));

std::sort(transfers.begin(), transfers.end(), [](const transfer_view& a, const transfer_view& b) -> bool {
if (a.confirmed && !b.confirmed)
return true;
if (a.confirmed != b.confirmed)
return a.confirmed;
if (a.height != b.height)
return a.height < b.height;
if (a.timestamp != b.timestamp)
Expand Down

0 comments on commit 6716f7f

Please sign in to comment.