aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-04-02 11:11:18 +0100
committermoneromooo-monero <moneromooo-monero@users.noreply.github.com>2017-04-02 11:11:18 +0100
commit9ae566d0ddeeefdfbd35726f7074d32166f5c047 (patch)
tree564dd284b77f47226a183bf35ae42f72cf0c4bcb
parentsimplewallet: allow setting confirm-missing-payment-id in watch wallets (diff)
downloadmonero-9ae566d0ddeeefdfbd35726f7074d32166f5c047.tar.xz
simplewallet: fix cold signing of split transactions
They'd be rejected as suspicious as the change goes to more than one destination. However, split transactions will most likely include fake zero amount change to random addresses, so we only consider change with non zero amount for this.
-rw-r--r--src/simplewallet/simplewallet.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 67dacda91..9215ec821 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -3035,6 +3035,7 @@ bool simple_wallet::accept_loaded_tx(const std::function<size_t()> get_num_txes,
size_t min_mixin = ~0;
std::unordered_map<std::string, uint64_t> dests;
const std::string wallet_address = m_wallet->get_account().get_public_address_str(m_wallet->testnet());
+ int first_known_non_zero_change_index = -1;
for (size_t n = 0; n < get_num_txes(); ++n)
{
const tools::wallet2::tx_construction_data &cd = get_tx(n);
@@ -3069,10 +3070,15 @@ bool simple_wallet::accept_loaded_tx(const std::function<size_t()> get_num_txes,
fail_msg_writer() << tr("Claimed change is larger than payment to the change address");
return false;
}
- if (memcmp(&cd.change_dts.addr, &get_tx(0).change_dts.addr, sizeof(cd.change_dts.addr)))
+ if (cd.change_dts.amount > 0)
{
- fail_msg_writer() << tr("Change does to more than one address");
- return false;
+ if (first_known_non_zero_change_index == -1)
+ first_known_non_zero_change_index = n;
+ if (memcmp(&cd.change_dts.addr, &get_tx(first_known_non_zero_change_index).change_dts.addr, sizeof(cd.change_dts.addr)))
+ {
+ fail_msg_writer() << tr("Change goes to more than one address");
+ return false;
+ }
}
change += cd.change_dts.amount;
it->second -= cd.change_dts.amount;