login: fix session_kill(..., KILL_LEADER,...) (#35105)
author12paper <104864644+12paper@users.noreply.github.com>
Sun, 10 Nov 2024 02:13:39 +0000 (03:13 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 13 Nov 2024 19:48:10 +0000 (19:48 +0000)
`loginctl kill-session --kill-whom=leader <N>` (or the D-Bus equivalent)
doesn't work because logind ends up calling `KillUnit(..., "main", ...)`
on a scope unit and these don't have a `MainPID` property. Here, I just
make it send a signal to the `Leader` directly.

(cherry picked from commit 8254755091847105c33e473c62cdc7621ed275bc)

src/login/logind-session.c

index 4758cb9ff1bb28477a9d714a3d60aee6d4230fc8..5f4c13652f51fad9c369d7666d55ea2cc9546a6b 100644 (file)
@@ -1384,10 +1384,20 @@ SessionState session_get_state(Session *s) {
 int session_kill(Session *s, KillWho who, int signo) {
         assert(s);
 
-        if (!s->scope)
-                return -ESRCH;
+        switch (who) {
+
+        case KILL_ALL:
+                if (!s->scope)
+                        return -ESRCH;
+
+                return manager_kill_unit(s->manager, s->scope, KILL_ALL, signo, NULL);
 
-        return manager_kill_unit(s->manager, s->scope, who, signo, NULL);
+        case KILL_LEADER:
+                return pidref_kill(&s->leader, signo);
+
+        default:
+                assert_not_reached();
+        }
 }
 
 static int session_open_vt(Session *s, bool reopen) {