Browse Source

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.

Conflicts:
	src/qt/addresstablemodel.cpp

Rebased-from: 72378a3b67c559310f8047a622ee109850f80e59 0.8.x
0.8
Wladimir J. van der Laan 11 years ago committed by Warren Togami
parent
commit
d2ee3aecbe
  1. 33
      src/qt/addresstablemodel.cpp

33
src/qt/addresstablemodel.cpp

@ -224,33 +224,34 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
if(role == Qt::EditRole) 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 // Do nothing, if old label == new label
if(rec->label == value.toString()) if(rec->label == value.toString())
{ {
editStatus = NO_CHANGES; editStatus = NO_CHANGES;
return false; return false;
} }
wallet->SetAddressBookName(CBitcoinAddress(rec->address.toStdString()).Get(), value.toString().toStdString()); wallet->SetAddressBookName(curAddress, value.toString().toStdString());
break; } else if(index.column() == Address) {
case Address: CTxDestination newAddress = CBitcoinAddress(value.toString().toStdString()).Get();
// Do nothing, if old address == new address // Refuse to set invalid address, set error status and return false
if(CBitcoinAddress(rec->address.toStdString()) == CBitcoinAddress(value.toString().toStdString())) if(boost::get<CNoDestination>(&newAddress))
{ {
editStatus = NO_CHANGES; editStatus = INVALID_ADDRESS;
return false; return false;
} }
// Refuse to set invalid address, set error status and return false // Do nothing, if old address == new address
else if(!walletModel->validateAddress(value.toString())) else if(newAddress == curAddress)
{ {
editStatus = INVALID_ADDRESS; editStatus = NO_CHANGES;
return false; return false;
} }
// Check for duplicate addresses to prevent accidental deletion of addresses, if you try // 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) // 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; editStatus = DUPLICATE_ADDRESS;
return false; return false;
@ -258,16 +259,12 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
// Double-check that we're not overwriting a receiving address // Double-check that we're not overwriting a receiving address
else if(rec->type == AddressTableEntry::Sending) else if(rec->type == AddressTableEntry::Sending)
{ {
{
LOCK(wallet->cs_wallet);
// Remove old entry // Remove old entry
wallet->DelAddressBookName(CBitcoinAddress(rec->address.toStdString()).Get()); wallet->DelAddressBookName(curAddress);
// Add new entry with new address // Add new entry with new address
wallet->SetAddressBookName(CBitcoinAddress(value.toString().toStdString()).Get(), rec->label.toStdString()); wallet->SetAddressBookName(newAddress, rec->label.toStdString());
} }
} }
break;
}
return true; return true;
} }
return false; return false;

Loading…
Cancel
Save