]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: don't use assertion for deserialized_pid
authorMike Yuan <me@yhndnzj.com>
Fri, 5 Jan 2024 17:47:20 +0000 (01:47 +0800)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 6 Jan 2024 20:27:25 +0000 (05:27 +0900)
Follow-up for 9d5b6901007e6717c6a37c49eb73bc0260e93893

Otherwise if session_load() went wrong, and we got pidfd
from fdstore, the assertion is triggered.

src/login/logind.c

index 4dd89288e706c9be7086a63405263315d7e7c238..7b6467d63a040175b9f50bf5c62b6ed5ceda44bc 100644 (file)
@@ -438,6 +438,13 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
         assert(fdname);
         assert(fd >= 0);
 
+        if (!pid_is_valid(s->deserialized_pid)) {
+                r = log_warning_errno(SYNTHETIC_ERRNO(EOWNERDEAD),
+                                      "Got leader pidfd for session '%s', but LEADER= is not set, refusing.",
+                                      s->id);
+                goto fail_close;
+        }
+
         if (!s->leader_fd_saved)
                 log_warning("Got leader pidfd for session '%s', but not recorded in session state, proceeding anyway.",
                             s->id);
@@ -450,13 +457,9 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
                         log_debug_errno(r, "Leader of session '%s' is gone while deserializing.", s->id);
                 else
                         log_warning_errno(r, "Failed to create reference to leader of session '%s': %m", s->id);
-
-                close_and_notify_warn(fd, fdname);
-                return r;
+                goto fail_close;
         }
 
-        assert(pid_is_valid(s->deserialized_pid));
-
         if (leader_fdstore.pid != s->deserialized_pid)
                 log_warning("Leader from pidfd (" PID_FMT ") doesn't match with LEADER=" PID_FMT " for session '%s', proceeding anyway.",
                             leader_fdstore.pid, s->deserialized_pid, s->id);
@@ -466,6 +469,10 @@ static int deliver_session_leader_fd_consume(Session *s, const char *fdname, int
                 return log_warning_errno(r, "Failed to attach leader pidfd for session '%s': %m", s->id);
 
         return 0;
+
+fail_close:
+        close_and_notify_warn(fd, fdname);
+        return r;
 }
 
 static int manager_attach_session_fd_one_consume(Manager *m, const char *fdname, int fd) {