diff options
author | Lennart Poettering <lennart@poettering.net> | 2017-11-13 19:06:11 +0100 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2017-11-13 19:06:11 +0100 |
commit | c8da38bdce575d4b32b5428be072e722f8c4ba39 (patch) | |
tree | 5b0a210754739434d35e0d4f843a99cb48576285 /src | |
parent | 39a1d713da4a5c60c88d97b864f01622e83a63ca (diff) |
logind: use the new FDSTOREREMOVE=1 sd_notify() message
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
Diffstat (limited to 'src')
-rw-r--r-- | src/login/logind-session-device.c | 41 | ||||
-rw-r--r-- | src/login/logind-session-device.h | 1 |
2 files changed, 29 insertions, 13 deletions
diff --git a/src/login/logind-session-device.c b/src/login/logind-session-device.c index b347ef52a..c48889c3e 100644 --- a/src/login/logind-session-device.c +++ b/src/login/logind-session-device.c @@ -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) { diff --git a/src/login/logind-session-device.h b/src/login/logind-session-device.h index 83aef1e18..84b1e6ad2 100644 --- a/src/login/logind-session-device.h +++ b/src/login/logind-session-device.h @@ -40,6 +40,7 @@ struct SessionDevice { int fd; bool active; DeviceType type; + bool pushed_fd; LIST_FIELDS(struct SessionDevice, sd_by_device); }; |