chiark / gitweb /
logind: use the new FDSTOREREMOVE=1 sd_notify() message
authorLennart Poettering <lennart@poettering.net>
Mon, 13 Nov 2017 18:06:11 +0000 (19:06 +0100)
committerSven Eden <yamakuzure@gmx.net>
Mon, 13 Nov 2017 18:06:11 +0000 (19:06 +0100)
Let's explicitly tell PID 1 that we don't need an fd anymore, instead of
relying exclusively on POLLERR/POLLHUP for it to be removed.

Fixes: #6908
src/login/logind-session-device.c
src/login/logind-session-device.h

index b347ef52a8a6dd763385ea7e7423174201aff423..c48889c3e50e340b6361e098d88822332e0852ba 100644 (file)
@@ -413,6 +413,17 @@ error:
 void session_device_free(SessionDevice *sd) {
         assert(sd);
 
+        if (sd->pushed_fd) {
+                const char *m;
+
+                /* Remove the pushed fd again, just in case. */
+
+                m = strjoina("FDSTOREREMOVE=1\n"
+                             "FDNAME=session-", sd->session->id);
+
+                (void) sd_notify(false, m);
+        }
+
         session_device_stop(sd);
         session_device_notify(sd, SESSION_DEVICE_RELEASE);
         close_nointr(sd->fd);
@@ -492,26 +503,30 @@ unsigned int session_device_try_pause_all(Session *s) {
 }
 
 int session_device_save(SessionDevice *sd) {
-        _cleanup_free_ char *state = NULL;
+        const char *m;
         int r;
 
         assert(sd);
 
-        /* Store device fd in PID1. It will send it back to us on
-         * restart so revocation will continue to work. To make things
-         * simple, send fds for all type of devices even if they don't
-         * support the revocation mechanism so we don't have to handle
-         * them differently later.
+        /* Store device fd in PID1. It will send it back to us on restart so revocation will continue to work. To make
+         * things simple, send fds for all type of devices even if they don't support the revocation mechanism so we
+         * don't have to handle them differently later.
          *
-         * Note: for device supporting revocation, PID1 will drop a
-         * stored fd automatically if the corresponding device is
-         * revoked. */
-        r = asprintf(&state, "FDSTORE=1\n"
-                             "FDNAME=session-%s", sd->session->id);
+         * Note: for device supporting revocation, PID1 will drop a stored fd automatically if the corresponding device
+         * is revoked. */
+
+        if (sd->pushed_fd)
+                return 0;
+
+        m = strjoina("FDSTORE=1\n"
+                     "FDNAME=session", sd->session->id);
+
+        r = sd_pid_notify_with_fds(0, false, m, &sd->fd, 1);
         if (r < 0)
-                return -ENOMEM;
+                return r;
 
-        return sd_pid_notify_with_fds(0, false, state, &sd->fd, 1);
+        sd->pushed_fd = true;
+        return 1;
 }
 
 void session_device_attach_fd(SessionDevice *sd, int fd, bool active) {
index 83aef1e18c951da82b35f554df2cc5f637b0c923..84b1e6ad23e8160ca335a8978c24c778cd175e51 100644 (file)
@@ -40,6 +40,7 @@ struct SessionDevice {
         int fd;
         bool active;
         DeviceType type;
+        bool pushed_fd;
 
         LIST_FIELDS(struct SessionDevice, sd_by_device);
 };