Skip to content

Log exit code and command line on spawn failures#224

Merged
marmarek merged 2 commits into
QubesOS:mainfrom
ben-grande:log
May 11, 2026
Merged

Log exit code and command line on spawn failures#224
marmarek merged 2 commits into
QubesOS:mainfrom
ben-grande:log

Conversation

@ben-grande

@ben-grande ben-grande commented Mar 3, 2026

Copy link
Copy Markdown
Contributor

For: QubesOS/qubes-issues#10740


Logging this information makes it easier to grep on huge logs.

@codecov

codecov Bot commented Mar 15, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 71.42857% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 80.91%. Comparing base (f6e44ea) to head (489e256).
⚠️ Report is 20 commits behind head on main.

Files with missing lines Patch % Lines
agent/qrexec-agent.c 50.00% 1 Missing ⚠️
daemon/qrexec-daemon-common.c 80.00% 1 Missing ⚠️
libqrexec/exec.c 0.00% 1 Missing ⚠️
libqrexec/log.c 0.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #224      +/-   ##
==========================================
+ Coverage   78.96%   80.91%   +1.95%     
==========================================
  Files          55       58       +3     
  Lines       10544    10817     +273     
==========================================
+ Hits         8326     8753     +427     
+ Misses       2218     2064     -154     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread agent/qrexec-agent-data.c Outdated
}
if (exit_code != 0) {
LOG(ERROR, "failed to spawn process");
LOG(ERROR, "failed to spawn process %d, exited with %d", pid, exit_code);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When execute_parsed_qubes_rpc_command() fails, the process wasn't started, so pid isn't really initialized - this basically logs random garbage from stack...
As for exit_code here, from what I see it can be either QREXEC_EXIT_PROBLEM (125) or QREXEC_EXIT_SERVICE_NOT_FOUND (127), not any more details. And I think most issues that could use some more info are about just exit code 125.

OTOH, what might be more useful is to log what command failed, to ease searching the logs. Note most error paths leading to returning an error here already log the reason to stderr, so, having having command/service name here would make it a bit easier to find the previous line with more info.

@ben-grande

Copy link
Copy Markdown
Contributor Author

PipelineRetryFailed

2 similar comments
@ben-grande

Copy link
Copy Markdown
Contributor Author

PipelineRetryFailed

@ben-grande

Copy link
Copy Markdown
Contributor Author

PipelineRetryFailed

@ben-grande

Copy link
Copy Markdown
Contributor Author

Marek, some weird failure: https://gitlab.com/QubesOS/qubes-core-qrexec/-/jobs/14147342413

_______ TestAgentExecQubesRpc.test_exec_service_with_invalid_config_path _______
self = <qrexec.tests.socket.agent.TestAgentExecQubesRpc testMethod=test_exec_service_with_invalid_config_path>
        def test_exec_service_with_invalid_config_path(self):
            util.make_executable_service(
                self.tempdir,
                "rpc",
                "qubes.Service",
                """\
    #!/bin/sh
    echo "arg: $1, remote domain: $QREXEC_REMOTE_DOMAIN"
    """,
            )
            config_path = os.path.join(self.tempdir, "rpc-config")
            os.rmdir(config_path)
            os.symlink("/dev/null/doesnotexist", config_path)
>           self._test_exec_service_fail()
qrexec/tests/socket/agent.py:659: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
qrexec/tests/socket/agent.py:616: in _test_exec_service_fail
    self.assertListEqual(
E   AssertionError: Lists differ: [] != [(401, b''), (402, b''), (403, b'}\x00\x00\x00')]
E   
E   Second list contains 3 additional elements.
E   First extra element 0:
E   (401, b'')
E   
E   - []
E   + [(401, b''), (402, b''), (403, b'}\x00\x00\x00')]
----------------------------- Captured stderr call -----------------------------
2026-04-29 12:16:37.017 qrexec-agent[2184]: exec.c:437:find_file: stat/lstat(/tmp/tmppsnv8acm/rpc-config/qubes.Service+arg): Not a directory
2026-04-29 12:16:37.017 qrexec-agent[2184]: qrexec-agent.c:606:handle_server_exec_request_init: Could not load config for command gitlab-runner:QUBESRPC qubes.Service+arg domX

@marmarek

Copy link
Copy Markdown
Member
2026-04-29 12:16:37.017 qrexec-agent[2184]: qrexec-agent.c:606:handle_server_exec_request_init: Could not load config for command gitlab-runner:QUBESRPC qubes.Service+arg domX

This is expected given the test name. But it should send final packets. The test passes on main, so I think this PR introduces the regression. Maybe it crashes before sending it? Looking at the code, one explanation could be cmd being NULL - that would crash it exactly before sending those final packets.

@ben-grande

Copy link
Copy Markdown
Contributor Author

cmd being NULL

Here the cmd is NULL, but as this caller has access to cmdline, I think the solution is to pass it along.

@qubesos-bot

qubesos-bot commented May 5, 2026

Copy link
Copy Markdown

OpenQA test summary

Complete test suite and dependencies: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026050811-devel&flavor=pull-requests

Test run included the following:

New failures, excluding unstable

Compared to: https://openqa.qubes-os.org/tests/overview?distri=qubesos&version=4.3&build=2026050504-devel&flavor=update

  • system_tests_suspend

    • suspend: wait_serial (unknown)
      # Command: qvm-run -p sys-firewall true...

    • suspend: Failed (test died + timed out)
      # Test died: command 'qvm-run -p sys-firewall true' timed out at /u...

    • suspend: wait_serial (unknown)
      # Result:...

  • system_tests_whonix

    • whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...
  • system_tests_audio

  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...
  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...
  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

Failed tests

18 failures
  • system_tests_whonix@hw1

    • whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...

    • whonixcheck: fail (unknown)
      Whonixcheck for whonix-workstation-18 failed...

    • whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_suspend

    • suspend: wait_serial (unknown)
      # Command: qvm-run -p sys-firewall true...

    • suspend: Failed (test died + timed out)
      # Test died: command 'qvm-run -p sys-firewall true' timed out at /u...

    • suspend: wait_serial (unknown)
      # Result:...

  • system_tests_whonix

    • whonixcheck: fail (unknown)
      Whonixcheck for sys-whonix failed...

    • whonixcheck: Failed (test died)
      # Test died: systemcheck failed at qubesos/tests/whonixcheck.pm lin...

  • system_tests_audio

  • system_tests_qwt_win10@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win11@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_qwt_win10_seamless@hw13

    • windows_install: wait_serial (wait serial expected)
      # wait_serial expected: qr/install-complete-\d+-/...

    • windows_install: Failed (test died + timed out)
      # Test died: Install timed out at qubesos/tests/windows_install.pm ...

  • system_tests_guivm_gpu_gui_interactive@hw13

    • shutdown: unnamed test (unknown)
    • shutdown: Failed (test died)
      # Test died: no candidate needle with tag(s) 'text-logged-in-root' ...

Fixed failures

Compared to: https://openqa.qubes-os.org/tests/176874#dependencies

32 fixed
  • system_tests_pvgrub_salt_storage

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.grub failed (exit code 1), details reported...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_41_HVMGrub_debian-13-xfce: test_000_standalone_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_001_standalone_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_debian-13-xfce: test_011_template_based_vm_dracut (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_41_HVMGrub_fedora-43-xfce: test_010_template_based_vm (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_audio@hw1

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.audio failed (exit code 1), details reporte...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_20_AudioVM_Pulse_debian-13-xfce: test_222_audio_rec_unmuted_pulseaudio (failure)
      AssertionError: only silence detected, no useful audio data

  • system_tests_network_ipv6

    • system_tests: Fail (unknown)
      Tests qubes.tests.integ.network_ipv6 failed (exit code 1), details ...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • VmIPv6Networking_fedora-43-xfce: test_001_simple_networking_paused_from_none_to_existent (error)
      raise TimeoutError from exc_val... TimeoutError

  • system_tests_extra

    • system_tests: Fail (unknown)
      Tests qubes.tests.extra failed (exit code 1), details reported sepa...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • TC_01_InputProxyExclude_debian-13-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_01_InputProxyExclude_fedora-43-xfce: test_000_qemu_tablet (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

    • TC_00_QVCTest_fedora-43-xfce: test_010_screenshare (failure + cleanup)
      ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^... AssertionError: 1179648 != 0

    • TC_00_QVCTest_whonix-gateway-18: test_010_screenshare (failure + cleanup)
      AssertionError: 2.3156185715769593 not less than 2.0

    • TC_00_PDFConverter_fedora-43-xfce: test_004_cancel_stops_conversion (failure)
      AssertionError: DispVM not cleaned up 10s after cancel: {<DispVM at...

  • system_tests_usbproxy

    • system_tests: Fail (unknown)
      Tests qubes.tests.extra failed (exit code 1), details reported sepa...

    • system_tests: Failed (test died)
      # Test died: Some tests failed at qubesos/tests/system_tests.pm lin...

    • system_tests: wait_serial (wait serial expected)
      # wait_serial expected: qr/h3uXO-\d+-/...

    • TC_20_USBProxy_core3_fedora-43-xfce: test_090_attach_stubdom (error)
      qubes.exc.QubesVMError: Cannot connect to qrexec agent for 120 seco...

  • system_tests_audio

  • system_tests_qwt_win10_seamless@hw13

    • windows_clipboard_and_filecopy: unnamed test (unknown)
    • windows_clipboard_and_filecopy: Failed (test died)
      # Test died: no candidate needle with tag(s) 'windows-Edge-address-...

Unstable tests

Details

Performance Tests

Performance degradation:

30 performance degradations
  • whonix-gateway-18_socket-data-duplex: 101.34 🔻 ( previous job: 90.03, degradation: 112.55%)
  • whonix-workstation-18_socket: 8.46 🔻 ( previous job: 7.66, degradation: 110.48%)
  • dom0_root_seq1m_q1t1_write 3:write_bandwidth_kb: 177580.00 🔻 ( previous job: 199974.00, degradation: 88.80%)
  • dom0_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 8048.00 🔻 ( previous job: 8963.00, degradation: 89.79%)
  • dom0_varlibqubes_seq1m_q1t1_write 3:write_bandwidth_kb: 179731.00 🔻 ( previous job: 201978.00, degradation: 88.99%)
  • dom0_varlibqubes_rnd4k_q32t1_read 3:read_bandwidth_kb: 19920.00 🔻 ( previous job: 102155.00, degradation: 19.50%)
  • dom0_varlibqubes_rnd4k_q32t1_write 3:write_bandwidth_kb: 4683.00 🔻 ( previous job: 10623.00, degradation: 44.08%)
  • fedora-43-xfce_root_seq1m_q8t1_write 3:write_bandwidth_kb: 112012.00 🔻 ( previous job: 138144.00, degradation: 81.08%)
  • fedora-43-xfce_root_seq1m_q1t1_write 3:write_bandwidth_kb: 26468.00 🔻 ( previous job: 78270.00, degradation: 33.82%)
  • fedora-43-xfce_private_rnd4k_q32t1_write 3:write_bandwidth_kb: 2039.00 🔻 ( previous job: 3674.00, degradation: 55.50%)
  • fedora-43-xfce_volatile_seq1m_q8t1_read 3:read_bandwidth_kb: 313007.00 🔻 ( previous job: 378957.00, degradation: 82.60%)
  • fedora-43-xfce_volatile_rnd4k_q1t1_read 3:read_bandwidth_kb: 7568.00 🔻 ( previous job: 8667.00, degradation: 87.32%)
  • debian-13-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:3.544): 42.52 🔻 ( previous job: 38.52, degradation: 110.40%)
  • debian-13-xfce_dom0-dispvm-preload-4-delay-0-api (mean:2.805): 33.67 🔻 ( previous job: 29.50, degradation: 114.12%)
  • debian-13-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:2.772): 33.26 🔻 ( previous job: 28.74, degradation: 115.73%)
  • debian-13-xfce_dom0-dispvm-preload-2-gui-api (mean:5.047): 60.56 🔻 ( previous job: 53.65, degradation: 112.89%)
  • debian-13-xfce_dom0-dispvm-preload-6-gui-api (mean:3.802): 45.63 🔻 ( previous job: 41.47, degradation: 110.03%)
  • debian-13-xfce_dom0-vm-gui-api (mean:0.079): 0.95 🔻 ( previous job: 0.47, degradation: 204.52%)
  • fedora-43-xfce_dom0-dispvm-preload-2-api (mean:4.065): 48.78 🔻 ( previous job: 44.03, degradation: 110.80%)
  • fedora-43-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.805): 45.66 🔻 ( previous job: 41.41, degradation: 110.26%)
  • fedora-43-xfce_dom0-vm-api (mean:0.05): 0.60 🔻 ( previous job: 0.47, degradation: 129.46%)
  • fedora-43-xfce_dom0-vm-gui-api (mean:0.05): 0.60 🔻 ( previous job: 0.46, degradation: 132.09%)
  • whonix-workstation-18_dom0-dispvm-preload-2-api (mean:4.538): 54.46 🔻 ( previous job: 48.39, degradation: 112.54%)
  • whonix-workstation-18_dom0-dispvm-preload-4-api (mean:3.572): 42.86 🔻 ( previous job: 38.29, degradation: 111.94%)
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-0-api (mean:4.0): 48.00 🔻 ( previous job: 43.23, degradation: 111.02%)
  • whonix-workstation-18_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:4.317): 51.80 🔻 ( previous job: 42.67, degradation: 121.41%)
  • whonix-workstation-18_dom0-dispvm-preload-2-gui-api (mean:6.842): 82.10 🔻 ( previous job: 72.05, degradation: 113.95%)
  • whonix-workstation-18_dom0-dispvm-preload-4-gui-api (mean:5.507): 66.08 🔻 ( previous job: 52.81, degradation: 125.12%)
  • whonix-workstation-18_dom0-vm-api (mean:0.07): 0.83 🔻 ( previous job: 0.43, degradation: 192.84%)
  • whonix-workstation-18_dom0-vm-gui-api (mean:0.086): 1.03 🔻 ( previous job: 0.56, degradation: 185.43%)

Remaining performance tests:

81 tests
  • debian-13-xfce_exec: 8.44 🔻 ( previous job: 7.85, degradation: 107.45%)
  • debian-13-xfce_exec-root: 27.35 🔻 ( previous job: 26.74, degradation: 102.27%)
  • debian-13-xfce_socket: 7.74 🟢 ( previous job: 8.37, improvement: 92.43%)
  • debian-13-xfce_socket-root: 8.41 🟢 ( previous job: 9.13, improvement: 92.11%)
  • debian-13-xfce_exec-data-simplex: 60.13 🟢 ( previous job: 63.05, improvement: 95.37%)
  • debian-13-xfce_exec-data-duplex: 63.94 🔻 ( previous job: 62.45, degradation: 102.39%)
  • debian-13-xfce_exec-data-duplex-root: 77.36 🟢 ( previous job: 78.04, improvement: 99.13%)
  • debian-13-xfce_socket-data-duplex: 90.96 🔻 ( previous job: 85.67, degradation: 106.18%)
  • fedora-43-xfce_exec: 9.07 🟢 ( previous job: 9.10, improvement: 99.68%)
  • fedora-43-xfce_exec-root: 70.98 🔻 ( previous job: 69.86, degradation: 101.61%)
  • fedora-43-xfce_socket: 7.26 🟢 ( previous job: 8.52, improvement: 85.22%)
  • fedora-43-xfce_socket-root: 8.29 🔻 ( previous job: 7.96, degradation: 104.26%)
  • fedora-43-xfce_exec-data-simplex: 66.15 🔻 ( previous job: 60.82, degradation: 108.75%)
  • fedora-43-xfce_exec-data-duplex: 57.44 🟢 ( previous job: 68.31, improvement: 84.09%)
  • fedora-43-xfce_exec-data-duplex-root: 99.44 🔻 ( previous job: 98.74, degradation: 100.71%)
  • fedora-43-xfce_socket-data-duplex: 96.34 🔻 ( previous job: 91.81, degradation: 104.93%)
  • whonix-gateway-18_exec: 7.93 🟢 ( previous job: 8.01, improvement: 98.98%)
  • whonix-gateway-18_exec-root: 123.48 🟢 ( previous job: 126.14, improvement: 97.89%)
  • whonix-gateway-18_socket: 8.92 🔻 ( previous job: 8.63, degradation: 103.37%)
  • whonix-gateway-18_socket-root: 7.78 🟢 ( previous job: 8.37, improvement: 92.96%)
  • whonix-gateway-18_exec-data-simplex: 64.67 🔻 ( previous job: 62.50, degradation: 103.47%)
  • whonix-gateway-18_exec-data-duplex: 66.97 🟢 ( previous job: 68.01, improvement: 98.47%)
  • whonix-gateway-18_exec-data-duplex-root: 129.18 🟢 ( previous job: 137.28, improvement: 94.10%)
  • whonix-workstation-18_exec: 8.53 🔻 ( previous job: 8.14, degradation: 104.86%)
  • whonix-workstation-18_exec-root: 144.35 🔻 ( previous job: 144.02, degradation: 100.23%)
  • whonix-workstation-18_socket-root: 8.52 🟢 ( previous job: 8.87, improvement: 96.04%)
  • whonix-workstation-18_exec-data-simplex: 62.81 🟢 ( previous job: 66.36, improvement: 94.65%)
  • whonix-workstation-18_exec-data-duplex: 68.74 🔻 ( previous job: 65.56, degradation: 104.86%)
  • whonix-workstation-18_exec-data-duplex-root: 140.76 🔻 ( previous job: 130.67, degradation: 107.72%)
  • whonix-workstation-18_socket-data-duplex: 91.17 🟢 ( previous job: 92.97, improvement: 98.06%)
  • dom0_root_seq1m_q8t1_read 3:read_bandwidth_kb: 352699.00 🔻 ( previous job: 388793.00, degradation: 90.72%)
  • dom0_root_seq1m_q8t1_write 3:write_bandwidth_kb: 140341.00 🟢 ( previous job: 119690.00, improvement: 117.25%)
  • dom0_root_seq1m_q1t1_read 3:read_bandwidth_kb: 440763.00 🟢 ( previous job: 245223.00, improvement: 179.74%)
  • dom0_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 105799.00 🟢 ( previous job: 13948.00, improvement: 758.52%)
  • dom0_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 6660.00 🔻 ( previous job: 6899.00, degradation: 96.54%)
  • dom0_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 4708.00 🔻 ( previous job: 5055.00, degradation: 93.14%)
  • dom0_varlibqubes_seq1m_q8t1_read 3:read_bandwidth_kb: 471694.00 🟢 ( previous job: 429040.00, improvement: 109.94%)
  • dom0_varlibqubes_seq1m_q8t1_write 3:write_bandwidth_kb: 304730.00 🟢 ( previous job: 257066.00, improvement: 118.54%)
  • dom0_varlibqubes_seq1m_q1t1_read 3:read_bandwidth_kb: 445255.00 🔻 ( previous job: 446202.00, degradation: 99.79%)
  • dom0_varlibqubes_rnd4k_q1t1_read 3:read_bandwidth_kb: 8304.00 🟢 ( previous job: 8179.00, improvement: 101.53%)
  • dom0_varlibqubes_rnd4k_q1t1_write 3:write_bandwidth_kb: 4520.00 🟢 ( previous job: 4404.00, improvement: 102.63%)
  • fedora-43-xfce_root_seq1m_q8t1_read 3:read_bandwidth_kb: 393609.00 🔻 ( previous job: 415113.00, degradation: 94.82%)
  • fedora-43-xfce_root_seq1m_q1t1_read 3:read_bandwidth_kb: 303407.00 🔻 ( previous job: 310781.00, degradation: 97.63%)
  • fedora-43-xfce_root_rnd4k_q32t1_read 3:read_bandwidth_kb: 82862.00 🔻 ( previous job: 90877.00, degradation: 91.18%)
  • fedora-43-xfce_root_rnd4k_q32t1_write 3:write_bandwidth_kb: 2237.00 🟢 ( previous job: 1519.00, improvement: 147.27%)
  • fedora-43-xfce_root_rnd4k_q1t1_read 3:read_bandwidth_kb: 9201.00 🟢 ( previous job: 8769.00, improvement: 104.93%)
  • fedora-43-xfce_root_rnd4k_q1t1_write 3:write_bandwidth_kb: 455.00 🟢 ( previous job: 262.00, improvement: 173.66%)
  • fedora-43-xfce_private_seq1m_q8t1_read 3:read_bandwidth_kb: 406740.00 🟢 ( previous job: 355690.00, improvement: 114.35%)
  • fedora-43-xfce_private_seq1m_q8t1_write 3:write_bandwidth_kb: 158573.00 🟢 ( previous job: 130275.00, improvement: 121.72%)
  • fedora-43-xfce_private_seq1m_q1t1_read 3:read_bandwidth_kb: 353532.00 🟢 ( previous job: 294295.00, improvement: 120.13%)
  • fedora-43-xfce_private_seq1m_q1t1_write 3:write_bandwidth_kb: 69260.00 🔻 ( previous job: 71992.00, degradation: 96.21%)
  • fedora-43-xfce_private_rnd4k_q32t1_read 3:read_bandwidth_kb: 92956.00 🟢 ( previous job: 81357.00, improvement: 114.26%)
  • fedora-43-xfce_private_rnd4k_q1t1_read 3:read_bandwidth_kb: 9160.00 🟢 ( previous job: 8429.00, improvement: 108.67%)
  • fedora-43-xfce_private_rnd4k_q1t1_write 3:write_bandwidth_kb: 783.00 🟢 ( previous job: 567.00, improvement: 138.10%)
  • fedora-43-xfce_volatile_seq1m_q8t1_write 3:write_bandwidth_kb: 163538.00 🟢 ( previous job: 95037.00, improvement: 172.08%)
  • fedora-43-xfce_volatile_seq1m_q1t1_read 3:read_bandwidth_kb: 359101.00 🟢 ( previous job: 202428.00, improvement: 177.40%)
  • fedora-43-xfce_volatile_seq1m_q1t1_write 3:write_bandwidth_kb: 48654.00 🟢 ( previous job: 26016.00, improvement: 187.02%)
  • fedora-43-xfce_volatile_rnd4k_q32t1_read 3:read_bandwidth_kb: 89139.00 🟢 ( previous job: 79218.00, improvement: 112.52%)
  • fedora-43-xfce_volatile_rnd4k_q32t1_write 3:write_bandwidth_kb: 3388.00 🟢 ( previous job: 1720.00, improvement: 196.98%)
  • fedora-43-xfce_volatile_rnd4k_q1t1_write 3:write_bandwidth_kb: 672.00 🟢 ( previous job: 548.00, improvement: 122.63%)
  • debian-13-xfce_dom0-dispvm-api (mean:6.062): 72.75 🟢 ( previous job: 74.50, improvement: 97.66%)
  • debian-13-xfce_dom0-dispvm-gui-api (mean:8.06): 96.72 🔻 ( previous job: 93.50, degradation: 103.45%)
  • debian-13-xfce_dom0-dispvm-preload-2-api (mean:3.293): 39.52 🔻 ( previous job: 37.79, degradation: 104.58%)
  • debian-13-xfce_dom0-dispvm-preload-2-delay-0-api (mean:3.118): 37.41 🔻 ( previous job: 34.29, degradation: 109.10%)
  • debian-13-xfce_dom0-dispvm-preload-4-api (mean:2.518): 30.22 🟢 ( previous job: 30.73, improvement: 98.31%)
  • debian-13-xfce_dom0-dispvm-preload-4-gui-api (mean:4.021): 48.25 🔻 ( previous job: 44.40, degradation: 108.68%)
  • debian-13-xfce_dom0-vm-api (mean:0.05): 0.60 🟢 ( previous job: 0.62, improvement: 96.77%)
  • fedora-43-xfce_dom0-dispvm-api (mean:7.471): 89.65 🔻 ( previous job: 89.33, degradation: 100.36%)
  • fedora-43-xfce_dom0-dispvm-gui-api (mean:10.098): 121.17 🔻 ( previous job: 112.35, degradation: 107.85%)
  • fedora-43-xfce_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:4.228): 50.73 🔻 ( previous job: 46.26, degradation: 109.66%)
  • fedora-43-xfce_dom0-dispvm-preload-4-api (mean:2.935): 35.22 🟢 ( previous job: 36.18, improvement: 97.34%)
  • fedora-43-xfce_dom0-dispvm-preload-4-delay-0-api (mean:3.297): 39.56 🔻 ( previous job: 36.15, degradation: 109.44%)
  • fedora-43-xfce_dom0-dispvm-preload-4-delay-minus-1d2-api (mean:3.23): 38.76 🔻 ( previous job: 36.13, degradation: 107.27%)
  • fedora-43-xfce_dom0-dispvm-preload-2-gui-api (mean:5.709): 68.51 🔻 ( previous job: 63.91, degradation: 107.19%)
  • fedora-43-xfce_dom0-dispvm-preload-4-gui-api (mean:4.758): 57.09 🔻 ( previous job: 52.06, degradation: 109.67%)
  • fedora-43-xfce_dom0-dispvm-preload-6-gui-api (mean:3.946): 47.35 🔻 ( previous job: 46.35, degradation: 102.16%)
  • whonix-workstation-18_dom0-dispvm-api (mean:8.429): 101.15 🔻 ( previous job: 97.14, degradation: 104.13%)
  • whonix-workstation-18_dom0-dispvm-gui-api (mean:10.829): 129.94 🔻 ( previous job: 121.86, degradation: 106.64%)
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-0-api (mean:4.394): 52.73 🔻 ( previous job: 48.26, degradation: 109.26%)
  • whonix-workstation-18_dom0-dispvm-preload-2-delay-minus-1d2-api (mean:5.338): 64.05 🔻 ( previous job: 59.22, degradation: 108.17%)
  • whonix-workstation-18_dom0-dispvm-preload-6-gui-api (mean:4.51): 54.12 🔻 ( previous job: 50.72, degradation: 106.71%)

@marmarek

marmarek commented May 6, 2026

Copy link
Copy Markdown
Member

Here the cmd is NULL, but as this caller has access to cmdline, I think the solution is to pass it along.

In that case (cmd==NULL), the command line is not very interesting, it's a SOCKETxx string, to match outgoing request. See handle_server_exec_request_do(), especially comments there. In practice it will be SOCKET12 most of the time.

So, maybe instead of passing along not very useful string, simply handle NULL cmd in that error message with some placeholder, like outgoing call? That would avoid confusion by having both cmd and cmdline in some of those functions (where only cmd should really be used).

@ben-grande

ben-grande commented May 6, 2026

Copy link
Copy Markdown
Contributor Author

So, maybe instead of passing along not very useful string, simply handle NULL cmd in that error message with some placeholder, like outgoing call?

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port_ipv6 2026-05-06 21:31:56.678 qrexec-agent[525084]: exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/::1
2026-05-06 21:31:56.679 qrexec-agent[525084]: qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService domX
PASSED
qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_port_from_arg 2026-05-06 21:31:56.761 qrexec-agent[525088]: exec.c:732:qubes_tcp_connect: Connecting to 127.0.0.1:65533
2026-05-06 21:31:56.762 qrexec-agent[525088]: qrexec-agent-data.c:275:handle_new_process_common: executed: user:QUBESRPC qubes.SocketService+65533 domX (pid 0)
2026-05-06 21:31:56.765 qrexec-agent[525088]: qrexec-agent-data.c:312:handle_new_process_common: Socket service closed
PASSED
qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_unexpected_host 2026-05-06 21:31:56.853 qrexec-agent[525093]: exec.c:727:qubes_tcp_connect: Invalid port number 127.0.0.1+65535
2026-05-06 21:31:56.853 qrexec-agent[525093]: qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+127.0.0.1+65535 domX

...

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_path 2026-05-06 21:44:04.219 qrexec-agent[545691]: exec.c:437:find_file: stat/lstat(/tmp/tmpmhkb13xp/rpc-config/qubes.Service+arg): Not a directory
2026-05-06 21:44:04.219 qrexec-agent[545691]: qrexec-agent.c:606:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
2026-05-06 21:44:04.220 qrexec-agent[545706]: qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

I think it is useful or am I misunderstanding something. Capturing stderr with -s: ./run-tests -v -s qrexec/tests/socket/agent.py -k TestAgent

That would avoid confusion by having both cmd and cmdline in some of those functions (where only cmd should really be used).

I wouldn't say I like the current solution over passing cmd, but cmd is being set to NULL when the rpc-config is invalid for example (07ec597), so cmd==NULL may be a socket service or failure to load the rpc-config.

In the case of invalid configuration file, it might make sense to free just invalid variables instead of destroying the whole struct. Would you prefer that I make an attempt at that?

@marmarek

marmarek commented May 6, 2026

Copy link
Copy Markdown
Member

so cmd==NULL may be a socket service or failure to load the rpc-config.

Right, and in this case such information is useful (and also my proposed message is wrong). But it's already logged in a separate message, no?

So, maybe to avoid confusion, rename the parameter to something like cmdline_for_logging, or original_cmdline?

@ben-grande

ben-grande commented May 7, 2026

Copy link
Copy Markdown
Contributor Author

so cmd==NULL may be a socket service or failure to load the rpc-config.

Right, and in this case such information is useful (and also my proposed message is wrong). But it's already logged in a separate message, no?

"failed to spawn process" for daemon and agent

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_1 
toml.c:112:parse_toml_value: /tmp/tmpuy4scvtr/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_2 
toml.c:112:parse_toml_value: /tmp/tmpj4j7c7wp/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_3 
toml.c:102:parse_toml_value: /tmp/tmp02x2rt8i/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_4 
toml.c:74:parse_toml_value: /tmp/tmprelbqyz2/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_5 
toml.c:271:qubes_toml_config_parse: /tmp/tmpqms1wixl/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_6 
exec.c:437:find_file: stat/lstat(/tmp/tmpziz77wjm/rpc-config/qubes.Service+arg): Not a directory
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_run_dom0_service_not_found 
exec.c:803:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 127): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdin_eof_user 
exec.c:495:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-client-eof=true
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdout_eof_user 
exec.c:500:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-service-eof=true
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_no_metadata_user 
exec.c:490:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if skip-service-descriptor=true
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_empty_host 
exec.c:417:find_file: /dev/tcp/ not followed by host
exec.c:805:find_qrexec_service: Error finding service: qubes.SocketService++65535
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService++65535 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_host 
exec.c:854:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+ domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_port 
exec.c:863:find_qrexec_service: No port provided, cannot connect to 127.0.0.1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+127.0.0.1 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port 
exec.c:854:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/127.0.0.1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port_ipv6 
exec.c:854:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/::1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_unexpected_host 
exec.c:729:qubes_tcp_connect: Invalid port number 127.0.0.1+65535
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+127.0.0.1+65535 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_broken_specific_service 
exec.c:437:find_file: stat/lstat(/tmp/tmppsfq_ntz/rpc/qubes.Service+arg): Not a directory
exec.c:805:find_qrexec_service: Error finding service: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_not_found 
exec.c:803:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 127): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_1 
toml.c:112:parse_toml_value: /tmp/tmp26kgi020/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_2 
toml.c:112:parse_toml_value: /tmp/tmpm43x9zdq/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_3 
toml.c:102:parse_toml_value: /tmp/tmppmw4nw0k/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_4 
toml.c:74:parse_toml_value: /tmp/tmplj7itdrq/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_5 
toml.c:271:qubes_toml_config_parse: /tmp/tmpisclwr37/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_6 
exec.c:437:find_file: stat/lstat(/tmp/tmpo_v8lf97/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_path 
exec.c:437:find_file: stat/lstat(/tmp/tmphdss27fp/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:607:handle_server_exec_request_init: Could not load config for command line: user:QUBESRPC qubes.Service+arg domX
qrexec-agent.c:688:handle_server_exec_request_do: CMD: empty
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

So in all cases where cmd == NULL/"CMD: empty", the cmdline is already logged in "Could not load config ...", but I find that weird, because the only relevant part about the cmdline at that point is just the service name and the argument, that are the necessary things to find the correct configuration.

I prefer how the daemon logging is done in this case, it only prints the full cmdline at the end. I made some modifications, see what you think (using cmdline_for_logging)

with cmdline at the end

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_1
toml.c:112:parse_toml_value: /tmp/tmp9zh3es45/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_2
toml.c:112:parse_toml_value: /tmp/tmppsvaj8yt/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_3
toml.c:102:parse_toml_value: /tmp/tmpq1oz2gh8/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_4
toml.c:74:parse_toml_value: /tmp/tmplos1sc13/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_5
toml.c:271:qubes_toml_config_parse: /tmp/tmp4ijwb5o2/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_6
exec.c:437:find_file: stat/lstat(/tmp/tmpykuf2w9i/rpc-config/qubes.Service+arg): Not a directory
qrexec-daemon-common.c:533:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 125): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_run_dom0_service_not_found
exec.c:801:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-daemon-common.c:461:handle_failed_exec: failed to spawn process for service (exited 127): QUBESRPC qubes.Service+arg src_domain name src_domain
PASSED
qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdin_eof_user
exec.c:495:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-client-eof=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.SocketService+arg2
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdout_eof_user
exec.c:500:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-service-eof=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.SocketService+arg2
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_no_metadata_user
exec.c:490:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if skip-service-descriptor=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.SocketService+arg2
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+arg2 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_empty_host
exec.c:417:find_file: /dev/tcp/ not followed by host
exec.c:803:find_qrexec_service: Error finding service: qubes.SocketService++65535
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService++65535 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_host
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+ domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_port
exec.c:861:find_qrexec_service: No port provided, cannot connect to 127.0.0.1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+127.0.0.1 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/127.0.0.1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port_ipv6
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/::1
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_unexpected_host
exec.c:727:qubes_tcp_connect: Invalid port number 127.0.0.1+65535
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.SocketService+127.0.0.1+65535 domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_broken_specific_service
exec.c:437:find_file: stat/lstat(/tmp/tmp66ynowng/rpc/qubes.Service+arg): Not a directory
exec.c:803:find_qrexec_service: Error finding service: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_null_argument_finds_service_for_empty_argument
qrexec-agent-data.c:278:handle_new_process_common: executed: user:QUBESRPC qubes.Service domX (pid 2038752)
qrexec-agent-data.c:314:handle_new_process_common: pid 2038752 exited with 0
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service
qrexec-agent-data.c:278:handle_new_process_common: executed: user:QUBESRPC qubes.Service+arg domX (pid 2038802)
qrexec-agent-data.c:314:handle_new_process_common: pid 2038802 exited with 0
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_bad_service
qrexec-agent-data.c:278:handle_new_process_common: executed: user:QUBESRPC qubes.Service+arg domX (pid 2038829)
qrexec-agent-data.c:314:handle_new_process_common: pid 2038829 exited with 126
FAILED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_keyword
qrexec-agent-data.c:278:handle_new_process_common: executed: user:QUBESRPC qubes.Service domX (pid 2038854)
qrexec-agent-data.c:314:handle_new_process_common: pid 2038854 exited with 0
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_not_found
exec.c:801:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 127): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_1
toml.c:112:parse_toml_value: /tmp/tmppuny3f0d/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_2
toml.c:112:parse_toml_value: /tmp/tmpj7e98sug/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_3
toml.c:102:parse_toml_value: /tmp/tmp4gze2464/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_4
toml.c:74:parse_toml_value: /tmp/tmpke0qn68q/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_5
toml.c:271:qubes_toml_config_parse: /tmp/tmplee3uwwm/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_6
exec.c:437:find_file: stat/lstat(/tmp/tmpfnol5cri/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_path
exec.c:437:find_file: stat/lstat(/tmp/tmpmr_um78b/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: qubes.Service+arg
qrexec-agent-data.c:261:handle_new_process_common: failed to spawn process (exited 125): user:QUBESRPC qubes.Service+arg domX
PASSED

Or if you prefer not passing the variable just for logging, as the "Cannot/Could load service configuration" already has access to the cmdline.

without passing the variable downstream

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_1
toml.c:112:parse_toml_value: /tmp/tmpq8fbbfsa/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_2
toml.c:112:parse_toml_value: /tmp/tmplbwnuinu/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_3
toml.c:102:parse_toml_value: /tmp/tmpfiln61lr/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_4
toml.c:74:parse_toml_value: /tmp/tmpkjpn85xk/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_5
toml.c:271:qubes_toml_config_parse: /tmp/tmpejmbgxk4/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_exec_service_with_invalid_config_6
exec.c:437:find_file: stat/lstat(/tmp/tmp2maauj9t/rpc-config/qubes.Service+arg): Not a directory
qrexec-daemon-common.c:529:run_qrexec_to_dom0: Cannot load service configuration, or forking process failed: QUBESRPC qubes.Service+arg src_domain name src_domain
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 125)
PASSED

qrexec/tests/socket/daemon.py::TestClient::test_run_dom0_service_not_found
exec.c:801:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-daemon-common.c:457:handle_failed_exec: failed to spawn process for service (exited 127)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdin_eof_user
exec.c:495:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-client-eof=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_exit_on_stdout_eof_user
exec.c:500:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if exit-on-service-eof=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_no_metadata_user
exec.c:490:load_service_config_v2: service qubes.SocketService+arg2: Cannot set explicit username if skip-service-descriptor=true
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.SocketService+arg2 domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_empty_host
exec.c:417:find_file: /dev/tcp/ not followed by host
exec.c:803:find_qrexec_service: Error finding service: qubes.SocketService++65535
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_host
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_missing_port
exec.c:861:find_qrexec_service: No port provided, cannot connect to 127.0.0.1
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/127.0.0.1
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_no_port_ipv6
exec.c:852:find_qrexec_service: No or empty argument provided, cannot connect to /dev/tcp/::1
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_connect_socket_tcp_unexpected_host
exec.c:727:qubes_tcp_connect: Invalid port number 127.0.0.1+65535
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_broken_specific_service
exec.c:437:find_file: stat/lstat(/tmp/tmpaogcx4iv/rpc/qubes.Service+arg): Not a directory
exec.c:803:find_qrexec_service: Error finding service: qubes.Service+arg
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_not_found
exec.c:801:find_qrexec_service: Service not found: qubes.Service+arg
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 127)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_1
toml.c:112:parse_toml_value: /tmp/tmp__dg8sqq/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_2
toml.c:112:parse_toml_value: /tmp/tmp9s7mgyl9/rpc-config/qubes.Service+arg:1: Unexpected junk after integer; note that only decimal integers with no excess leading zeros are supported
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_3
toml.c:102:parse_toml_value: /tmp/tmpb6u6raan/rpc-config/qubes.Service+arg:1: Unsupproted byte at start of value: 0
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_4
toml.c:74:parse_toml_value: /tmp/tmpppn6np9p/rpc-config/qubes.Service+arg:1: Double-quoted strings not implemented, use single quotes
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_5
toml.c:271:qubes_toml_config_parse: /tmp/tmp99pjfz1w/rpc-config/qubes.Service+arg:1: Missing '=' after key
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_6
exec.c:437:find_file: stat/lstat(/tmp/tmpsmbqvte4/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_path
exec.c:437:find_file: stat/lstat(/tmp/tmpkbm0r2fr/rpc-config/qubes.Service+arg): Not a directory
qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)
PASSED

@ben-grande

Copy link
Copy Markdown
Contributor Author

I noticed I didn't add a question mark, but the post above was meant to ask which option you prefer based on provided logs.

@marmarek

marmarek commented May 7, 2026

Copy link
Copy Markdown
Member

I prefer how the daemon logging is done in this case, it only prints the full cmdline at the end. I made some modifications, see what you think (using cmdline_for_logging)

With the name adjusted, it would be better with, especially since it just about MSG_SERVICE_CONNECT, but also normal service calls. Technically the information is there already, but it may be not easy to find which one is about which call (you need to look at PID in the journal message).

@ben-grande

Copy link
Copy Markdown
Contributor Author

but it may be not easy to find which one is about which call (you need to look at PID in the journal message).

Sometimes the PID changes: 2069764 and 2069766.

qrexec/tests/socket/agent.py::TestAgentExecQubesRpc::test_exec_service_with_invalid_config_path 2026-05-07 12:46:32.312 qrexec-agent[2069764]: exec.c:437:find_file: stat/lstat(/tmp/tmpkbm0r2fr/rpc-config/qubes.Service+arg): Not a directory
2026-05-07 12:46:32.312 qrexec-agent[2069764]: qrexec-agent.c:606:handle_server_exec_request_init: Cannot load service configuration: user:QUBESRPC qubes.Service+arg domX
2026-05-07 12:46:32.313 qrexec-agent[2069766]: qrexec-agent-data.c:260:handle_new_process_common: failed to spawn process (exited 125)

@ben-grande

Copy link
Copy Markdown
Contributor Author

With the name adjusted, it would be better with, especially since it just about MSG_SERVICE_CONNECT, but also normal service calls.

Done.

@marmarek
marmarek merged commit f52b940 into QubesOS:main May 11, 2026
4 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants