https://github.com/polkit-org/polkit/commit/690e6972ffe30473dacbfaa81158f5507cef99f6
https://github.com/polkit-org/polkit/commit/247952425829e41a47e83b2e433b9703713739f5

From 690e6972ffe30473dacbfaa81158f5507cef99f6 Mon Sep 17 00:00:00 2001
From: Jan Rybar <jrybar@redhat.com>
Date: Wed, 1 Oct 2025 13:23:45 +0200
Subject: [PATCH] DBusMock: CI broken after stop_dbus() removal

Because stop_dbus() was removed from DBusMock implementation, nothing
actually stops the system bus in testing environment in the wrapper.py
child process, hence the test times out into failure.
Adding simple kill(<dbus_PID>) in atexit() is sufficient, but the
original implementation in DBusMock seemed more graceful, so it was
pulled back in.
---
 test/wrapper.py | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/test/wrapper.py b/test/wrapper.py
index 14f4abdb..dc62f702 100755
--- a/test/wrapper.py
+++ b/test/wrapper.py
@@ -5,6 +5,8 @@
 import os
 import subprocess
 import sys
+import signal
+import time
 
 import dbus
 import dbus.mainloop.glib
@@ -36,6 +38,36 @@ def setup_test_namespace(data_dir):
         print("Python 3.12 is required for os.unshare(), skipping")
         sys.exit(77)
 
+
+def stop_dbus(pid: int) -> None:
+    """Stop a D-Bus daemon
+
+    If DBus daemon is not explicitly killed in the testing environment
+    the test times out and reports as failed.
+    This is a backport of a function dropped from DBusMock source (99c4800e9eed).
+    """
+    signal.signal(signal.SIGTERM, signal.SIG_IGN)
+    for _ in range(50):
+        try:
+            os.kill(pid, signal.SIGTERM)
+            os.waitpid(pid, os.WNOHANG)
+        except ChildProcessError:
+            break
+        except OSError as e:
+            if e.errno == errno.ESRCH:
+                break
+            raise
+        time.sleep(0.1)
+    else:
+        sys.stderr.write("ERROR: timed out waiting for bus process to terminate\n")
+        os.kill(pid, signal.SIGKILL)
+        try:
+            os.waitpid(pid, 0)
+        except ChildProcessError:
+            pass
+    signal.signal(signal.SIGTERM, signal.SIG_DFL)
+
+
 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
     parser.add_argument("test_executable",
@@ -51,7 +83,7 @@ def setup_test_namespace(data_dir):
     if args.mock_dbus:
         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
         dbusmock.DBusTestCase.start_system_bus()
-        atexit.register(dbusmock.DBusTestCase.stop_dbus, dbusmock.DBusTestCase.system_bus_pid)
+        atexit.register(stop_dbus, dbusmock.DBusTestCase.system_bus_pid)
 
     print(f"Executing '{args.test_executable}'")
     sys.stdout.flush()

From 247952425829e41a47e83b2e433b9703713739f5 Mon Sep 17 00:00:00 2001
From: Jan Rybar <jrybar@redhat.com>
Date: Sun, 5 Oct 2025 16:40:30 +0200
Subject: [PATCH] Missed 'errno' import in wrapper

---
 test/wrapper.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/test/wrapper.py b/test/wrapper.py
index dc62f70..9547720 100755
--- a/test/wrapper.py
+++ b/test/wrapper.py
@@ -7,6 +7,7 @@
 import sys
 import signal
 import time
+import errno
 
 import dbus
 import dbus.mainloop.glib
