aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2014-01-06 13:36:51 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2014-01-06 13:37:12 +0100
commit37d30ec3cf51aa332ce95ecf52fdd3e8e3d7228b (patch)
treef8002c42fa4062606197564710595654a7be42ba
parent7aedb914762eaf25f954790c50f9561103fee4b8 (diff)
parentd31ad26550403d9ed8d5aedd0f65d610b55d9497 (diff)
Merge pull request #3413
d31ad26 qt: Add missing lock in WalletModel::listCoins (Wladimir J. van der Laan) 28352af qt: protect SetAddressBook with cs_wallet lock everywhere (Wladimir J. van der Laan) aaf8d15 qt: Add missing LOCKs for locked coin functions (Wladimir J. van der Laan) 4757e92 qt: add missing cs_wallet lock in AddressTableModel::setData (Wladimir J. van der Laan)
-rw-r--r--src/qt/addresstablemodel.cpp37
-rw-r--r--src/qt/paymentserver.cpp1
-rw-r--r--src/qt/walletmodel.cpp5
3 files changed, 23 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;
}
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index ba5c06064f..cfa87c16ba 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -548,6 +548,7 @@ void PaymentServer::fetchPaymentACK(CWallet* wallet, SendCoinsRecipient recipien
else {
CPubKey newKey;
if (wallet->GetKeyFromPool(newKey)) {
+ LOCK(wallet->cs_wallet); // SetAddressBook
CKeyID keyID = newKey.GetID();
wallet->SetAddressBook(keyID, strAccount, "refund");
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index f08342b83e..6f3e3b0aaf 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -502,6 +502,7 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
std::vector<COutput> vCoins;
wallet->AvailableCoins(vCoins);
+ LOCK(wallet->cs_wallet); // ListLockedCoins, mapWallet
std::vector<COutPoint> vLockedCoins;
wallet->ListLockedCoins(vLockedCoins);
@@ -531,20 +532,24 @@ void WalletModel::listCoins(std::map<QString, std::vector<COutput> >& mapCoins)
bool WalletModel::isLockedCoin(uint256 hash, unsigned int n) const
{
+ LOCK(wallet->cs_wallet);
return wallet->IsLockedCoin(hash, n);
}
void WalletModel::lockCoin(COutPoint& output)
{
+ LOCK(wallet->cs_wallet);
wallet->LockCoin(output);
}
void WalletModel::unlockCoin(COutPoint& output)
{
+ LOCK(wallet->cs_wallet);
wallet->UnlockCoin(output);
}
void WalletModel::listLockedCoins(std::vector<COutPoint>& vOutpts)
{
+ LOCK(wallet->cs_wallet);
wallet->ListLockedCoins(vOutpts);
}