From c95a89cb9aa9179a8d4fd57480a3a3c304c6de8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Sun, 23 Nov 2025 13:58:35 +0100 Subject: [PATCH] devices: invalidate device cache on device-removed event Avoid returning old device when it got removed already. This also (hopefully) fixes event handlers getting VirtualDevice instead of real one: Failed to handle event: sys-usb, device-added:usb, {'device': sys-usb+4-1:0bda:8179:00E04C0001:uffffff} Traceback (most recent call last): File "/usr/lib/python3.13/site-packages/qubesadmin/events/__init__.py", line 278, in handle kwargs['device'] = plugged ^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.13/site-packages/qui/devices/device_widget.py", line 262, in device_added dev = backend.Device(device, self) File "/usr/lib/python3.13/site-packages/qui/devices/backend.py", line 156, in __init__ for interface in dev.interfaces: ^^^^^^^^^^^^^^ AttributeError: 'VirtualDevice' object has no attribute 'interfaces' --- qubesadmin/events/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/qubesadmin/events/__init__.py b/qubesadmin/events/__init__.py index a6a5f1e3..f6c35ed7 100644 --- a/qubesadmin/events/__init__.py +++ b/qubesadmin/events/__init__.py @@ -257,6 +257,12 @@ def handle(self, subject, event, **kwargs): ): devclass = event.split(":")[1] subject.devices[devclass]._attachment_cache = None + elif event.split(":")[0] in ("device-removed",): + devclass = event.split(":")[1] + try: + subject.devices[devclass]._dev_cache[kwargs["port"]] + except KeyError: + pass # deserialize known attributes if event.startswith('device-'):