mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-06-22 08:14:58 +03:00
On headless login the desktop manager opens a PAM session, which makes pam_systemd register a logind session and put the spawned Xorg + window manager and their children (e.g. pipewire) in a "session-<id>.scope" cgroup. Teardown only killed the Xorg and wm pids, so the rest of the session kept running, holding the logind session in "closing" and leaking runtime sockets and X display numbers on every reconnect. Capture the session scope cgroup from a child pid and, on teardown, kill the remaining processes in it and any descendant cgroups (cgroup.procs is not recursive, and a desktop may move pipewire and apps into child scopes), excluding our own service process and anything tracked in CHILD_PROCESS together with its descendants. The connection manager is a sudo child, so the tracked pid is the wrapper while the real --cm-no-ui worker may be a descendant (sudo with use_pty runs it under a monitor); both can share the scope when their PAM stack does not re-home them. Xorg is killed with SIGKILL, so it also leaves its "/tmp/.X<n>-lock" and "/tmp/.X11-unix/X<n>" behind; get_avail_display() treats either file as the display being in use, so the number is never reused and climbs until the range is exhausted. Remove those files for the session's display on teardown, as a clean Xorg exit would. Closes #15183 Signed-off-by: TBX3D <88289044+TBX3D@users.noreply.github.com>