1
0

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:
SomberNight
2025-08-04 15:14:10 +00:00
parent 1695948874
commit 608980c050

View File

@@ -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: