From fa790453f70af1c8c570d52c26a6f552c1b3ac31 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 25 Mar 2026 23:52:05 +0530 Subject: [PATCH] qvm-start-daemon: skip GUI/AUDIO for dead domain Avoid starting GUI/AUDIO when a domain has already terminated, resulting in invalid XID (-1). Add checks for VM running state and valid XID before spawning daemons. Fixes QubesOS/qubes-issues#10793 --- qubesadmin/tools/qvm_start_daemon.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/qubesadmin/tools/qvm_start_daemon.py b/qubesadmin/tools/qvm_start_daemon.py index 2f2c6f1d0..6983ad484 100644 --- a/qubesadmin/tools/qvm_start_daemon.py +++ b/qubesadmin/tools/qvm_start_daemon.py @@ -725,6 +725,14 @@ async def start_gui_for_vm(self, vm, monitor_layout=None): """ if getattr(vm, "is_preload", False): return + + if vm.xid < 0: + vm.log.warning( + "Skipping GUI start: invalid XID (%s)", + vm.xid, + ) + return + guid_cmd = self.common_guid_args(vm) guid_cmd.extend(["-d", str(vm.xid)]) @@ -753,6 +761,15 @@ async def start_gui_for_stubdomain(self, vm, force=False): """ if getattr(vm, "is_preload", False): return + + stubdom_xid = getattr(vm, "stubdom_xid", -1) + if stubdom_xid < 0: + vm.log.warning( + "Skipping stubdomain GUI start: invalid stubdom XID (%s)", + stubdom_xid, + ) + return + want_stubdom = force if not want_stubdom and vm.features.check_with_template( "gui-emulated", False @@ -786,10 +803,19 @@ async def start_audio_for_vm(self, vm): """ if getattr(vm, "is_preload", False): return + + xid = self.pacat_domid(vm) + if xid < 0: + vm.log.warning( + "Skipping AUDIO start: invalid XID (%s)", + xid, + ) + return + pacat_cmd = [ PACAT_DAEMON_PATH, "-l", - str(self.pacat_domid(vm)), + str(xid), vm.name, ] vm.log.info("Starting AUDIO")