aboutsummaryrefslogtreecommitdiff
path: root/src/qt/addresstablemodel.cpp
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2013-12-12 10:12:27 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2014-01-06 10:34:33 +0100
commit4757e923185d48c3169bc2d216db88484f036455 (patch)
tree33ef0c0f63b558468cb318b82d7f432cc2ba2ed5 /src/qt/addresstablemodel.cpp
parent7aedb914762eaf25f954790c50f9561103fee4b8 (diff)
downloadbitcoin-4757e923185d48c3169bc2d216db88484f036455.tar.xz
qt: add missing cs_wallet lock in AddressTableModel::setData
duplicate check in AddressTableModel::setData accesses wallet data structure as well as SetAddressBook without proper LOCK, fix this.
Diffstat (limited to 'src/qt/addresstablemodel.cpp')
-rw-r--r--src/qt/addresstablemodel.cpp37
1 files changed, 17 insertions, 20 deletions
diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp
index 5e7d8e6178..2987e5fdda 100644
--- a/src/qt/addresstablemodel.cpp
+++ b/src/qt/addresstablemodel.cpp
@@ -244,33 +244,34 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
if(role == Qt::EditRole)
{
- switch(index.column())
+ LOCK(wallet->cs_wallet); /* For SetAddressBook / DelAddressBook */
+ CTxDestination curAddress = CBitcoinAddress(rec->address.toStdString()).Get();
+ if(index.column() == Label)
{
- case Label:
// Do nothing, if old label == new label
if(rec->label == value.toString())
{
editStatus = NO_CHANGES;
return false;
}
- wallet->SetAddressBook(CBitcoinAddress(rec->address.toStdString()).Get(), value.toString().toStdString(), strPurpose);
- break;
- case Address:
- // Do nothing, if old address == new address
- if(CBitcoinAddress(rec->address.toStdString()) == CBitcoinAddress(value.toString().toStdString()))
+ wallet->SetAddressBook(curAddress, value.toString().toStdString(), strPurpose);
+ } else if(index.column() == Address) {
+ CTxDestination newAddress = CBitcoinAddress(value.toString().toStdString()).Get();
+ // Refuse to set invalid address, set error status and return false
+ if(boost::get<CNoDestination>(&newAddress))
{
- editStatus = NO_CHANGES;
+ editStatus = INVALID_ADDRESS;
return false;
}
- // Refuse to set invalid address, set error status and return false
- else if(!walletModel->validateAddress(value.toString()))
+ // Do nothing, if old address == new address
+ else if(newAddress == curAddress)
{
- editStatus = INVALID_ADDRESS;
+ editStatus = NO_CHANGES;
return false;
}
// Check for duplicate addresses to prevent accidental deletion of addresses, if you try
// to paste an existing address over another address (with a different label)
- else if(wallet->mapAddressBook.count(CBitcoinAddress(value.toString().toStdString()).Get()))
+ else if(wallet->mapAddressBook.count(newAddress))
{
editStatus = DUPLICATE_ADDRESS;
return false;
@@ -278,15 +279,11 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
// Double-check that we're not overwriting a receiving address
else if(rec->type == AddressTableEntry::Sending)
{
- {
- LOCK(wallet->cs_wallet);
- // Remove old entry
- wallet->DelAddressBook(CBitcoinAddress(rec->address.toStdString()).Get());
- // Add new entry with new address
- wallet->SetAddressBook(CBitcoinAddress(value.toString().toStdString()).Get(), rec->label.toStdString(), strPurpose);
- }
+ // Remove old entry
+ wallet->DelAddressBook(curAddress);
+ // Add new entry with new address
+ wallet->SetAddressBook(newAddress, rec->label.toStdString(), strPurpose);
}
- break;
}
return true;
}