wallet: more locking in delete_address
in particular, the "Cannot delete last remaining address from wallet" check should run inside the lock - tangentially related: https://github.com/spesmilo/electrum/issues/10104#issuecomment-3151165340
This commit is contained in:
@@ -3657,11 +3657,12 @@ class Imported_Wallet(Simple_Wallet):
|
|||||||
def delete_address(self, address: str) -> None:
|
def delete_address(self, address: str) -> None:
|
||||||
if not self.db.has_imported_address(address):
|
if not self.db.has_imported_address(address):
|
||||||
return
|
return
|
||||||
if len(self.get_addresses()) <= 1:
|
with self.lock:
|
||||||
|
if len(self.get_addresses()) <= 1: # check this inside lock
|
||||||
raise UserFacingException(_('Cannot delete last remaining address from wallet'))
|
raise UserFacingException(_('Cannot delete last remaining address from wallet'))
|
||||||
transactions_to_remove = set() # only referred to by this address
|
transactions_to_remove = set() # only referred to by this address
|
||||||
transactions_new = set() # txs that are not only referred to by address
|
transactions_new = set() # txs that are not only referred to by address
|
||||||
with self.lock:
|
# rm txs from history
|
||||||
for addr in self.db.get_history():
|
for addr in self.db.get_history():
|
||||||
details = self.adb.get_address_history(addr).items()
|
details = self.adb.get_address_history(addr).items()
|
||||||
if addr == address:
|
if addr == address:
|
||||||
@@ -3674,10 +3675,14 @@ class Imported_Wallet(Simple_Wallet):
|
|||||||
self.db.remove_addr_history(address)
|
self.db.remove_addr_history(address)
|
||||||
for tx_hash in transactions_to_remove:
|
for tx_hash in transactions_to_remove:
|
||||||
self.adb._remove_transaction(tx_hash)
|
self.adb._remove_transaction(tx_hash)
|
||||||
|
# rm label for addr
|
||||||
|
# TODO rm label for txids?
|
||||||
self.set_label(address, None)
|
self.set_label(address, None)
|
||||||
|
# rm receive requests for addr
|
||||||
if req := self.get_request_by_addr(address):
|
if req := self.get_request_by_addr(address):
|
||||||
self.delete_request(req.get_id())
|
self.delete_request(req.get_id())
|
||||||
self.set_frozen_state_of_addresses([address], False, write_to_disk=False)
|
self.set_frozen_state_of_addresses([address], False, write_to_disk=False)
|
||||||
|
# rm corresponding key from keystore
|
||||||
pubkey = self.get_public_key(address)
|
pubkey = self.get_public_key(address)
|
||||||
self.db.remove_imported_address(address)
|
self.db.remove_imported_address(address)
|
||||||
if pubkey:
|
if pubkey:
|
||||||
|
|||||||
Reference in New Issue
Block a user