wallet: fix misdetection of duplicates

This commit is contained in:
moneromooo-monero 2016-09-14 20:20:16 +01:00
parent 7d413f635f
commit 70b78bb2c8
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3

View file

@ -2806,9 +2806,10 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
continue; continue;
if (!daemon_resp.outs[i].unlocked) // don't add locked outs if (!daemon_resp.outs[i].unlocked) // don't add locked outs
continue; continue;
if (o > 0 && daemon_resp.outs[i].key == daemon_resp.outs[i - 1].key) // don't add duplicates auto item = std::make_tuple(req.outputs[i].index, daemon_resp.outs[i].key, daemon_resp.outs[i].mask);
if (std::find(outs.back().begin(), outs.back().end(), item) != outs.back().end()) // don't add duplicates
continue; continue;
outs.back().push_back(std::make_tuple(req.outputs[i].index, daemon_resp.outs[i].key, daemon_resp.outs[i].mask)); outs.back().push_back(item);
} }
if (outs.back().size() < fake_outputs_count + 1) if (outs.back().size() < fake_outputs_count + 1)
{ {
@ -2818,15 +2819,6 @@ void wallet2::get_outs(std::vector<std::vector<entry>> &outs, const std::list<tr
{ {
// sort the subsection, so any spares are reset in order // sort the subsection, so any spares are reset in order
std::sort(outs.back().begin(), outs.back().end(), [](const entry &a, const entry &b) { return std::get<0>(a) < std::get<0>(b); }); std::sort(outs.back().begin(), outs.back().end(), [](const entry &a, const entry &b) { return std::get<0>(a) < std::get<0>(b); });
// sanity check
for (size_t n = 1; n < outs.back().size(); ++n)
{
THROW_WALLET_EXCEPTION_IF(std::get<0>(outs.back()[n]) == std::get<0>(outs.back()[n-1]), error::wallet_internal_error,
"Duplicate indices though we did not ask for any");
THROW_WALLET_EXCEPTION_IF(std::get<1>(outs.back()[n]) == std::get<1>(outs.back()[n-1]), error::wallet_internal_error,
"Duplicate keys after we have weeded them out");
}
} }
base += requested_outputs_count; base += requested_outputs_count;
} }