From aa3c3a77fe880f60d9688d00c1c5d29e49d64852 Mon Sep 17 00:00:00 2001 From: Ben Grande Date: Thu, 15 Jan 2026 14:37:44 +0100 Subject: [PATCH] Return empty string when device denied is None Loading the XML interprets empty as None. Fixes: https://github.com/QubesOS/qubes-issues/issues/10254 --- qubes/tests/api_admin.py | 4 ++++ qubes/vm/qubesvm.py | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/qubes/tests/api_admin.py b/qubes/tests/api_admin.py index 7dee1cb2d..9c2aa53f4 100644 --- a/qubes/tests/api_admin.py +++ b/qubes/tests/api_admin.py @@ -4252,6 +4252,10 @@ def test_660_vm_device_denied_list_empty(self): self.assertEqual(actual, "") self.assertFalse(self.app.save.called) + self.vm.devices_denied = None + self.assertEqual(self.vm.devices_denied, "") + self.assertFalse(self.app.save.called) + def test_661_vm_device_denied_list(self): self.vm.devices_denied = "b******p012345pff**2*" actual = self.call_mgmt_func( diff --git a/qubes/vm/qubesvm.py b/qubes/vm/qubesvm.py index c652ce298..9c8d67cca 100644 --- a/qubes/vm/qubesvm.py +++ b/qubes/vm/qubesvm.py @@ -137,10 +137,12 @@ def _setter_default_user(self, prop, value): def _setter_denied_list(self, prop, value): """Helper for setting denied list""" - value = str(value) - if len(value) == 0: - return value + # Although the property has type str, loading an empty value from XML leads + # to None. + if not value: + return "" + value = str(value) # remove duplicates value = "".join( sorted(map(repr, set(DeviceInterface.from_str_bulk(value))))