From 9277945f9aca8ed56f8575ab3c6bab5ace859d3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 5 Sep 2015 15:20:15 +0200 Subject: sd-daemon: fix sd_is_mq for non-mq fds mq_getattr returns -1/EBADF for file descriptors which are not mq. But we should return 0 in this case. We first check that fd is a valid fd, so we can assume that if mq_getattr returns EBADF, it is simply a non-mq fd. There is a slight race, but there doesn't seem to be a nice way to fix it. --- src/libelogind/sd-daemon/sd-daemon.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src/libelogind/sd-daemon') diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c index af3dab7e4..7639b6d3b 100644 --- a/src/libelogind/sd-daemon/sd-daemon.c +++ b/src/libelogind/sd-daemon/sd-daemon.c @@ -315,10 +315,15 @@ _public_ int sd_is_socket_unix(int fd, int type, int listening, const char *path _public_ int sd_is_mq(int fd, const char *path) { struct mq_attr attr; - assert_return(fd >= 0, -EBADF); + /* Check that the fd is valid */ + assert_return(fcntl(fd, F_GETFD) >= 0, -errno); - if (mq_getattr(fd, &attr) < 0) + if (mq_getattr(fd, &attr) < 0) { + if (errno == EBADF) + /* A non-mq fd (or an invalid one, but we ruled that out above) */ + return 0; return -errno; + } if (path) { char fpath[PATH_MAX]; -- cgit v1.2.3 From bfe9c16671c456eb4c12e0ec01564c43a73c3127 Mon Sep 17 00:00:00 2001 From: Maciej Wereski Date: Tue, 8 Sep 2015 15:36:30 +0200 Subject: sd_pid_notify_with_fds: fix computing msg_controllen CMSG_SPACE(0) may return value other than 0. This caused sendmsg to fail with EINVAL, when have_pid or n_fds was 0. --- src/libelogind/sd-daemon/sd-daemon.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'src/libelogind/sd-daemon') diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c index 7639b6d3b..f74f44c65 100644 --- a/src/libelogind/sd-daemon/sd-daemon.c +++ b/src/libelogind/sd-daemon/sd-daemon.c @@ -406,8 +406,9 @@ _public_ int sd_pid_notify_with_fds(pid_t pid, int unset_environment, const char have_pid = pid != 0 && pid != getpid(); if (n_fds > 0 || have_pid) { - msghdr.msg_controllen = CMSG_SPACE(sizeof(int) * n_fds) + - CMSG_SPACE(sizeof(struct ucred) * have_pid); + /* CMSG_SPACE(0) may return value different then zero, which results in miscalculated controllen. */ + msghdr.msg_controllen = (n_fds ? CMSG_SPACE(sizeof(int) * n_fds) : 0) + + CMSG_SPACE(sizeof(struct ucred)) * have_pid; msghdr.msg_control = alloca(msghdr.msg_controllen); cmsg = CMSG_FIRSTHDR(&msghdr); -- cgit v1.2.3 From fdff7397c22a853e7e66ec72adb85c3f2f519f32 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Wed, 29 Mar 2017 10:06:16 +0200 Subject: [3/5] Apply missing fixes from upstream --- src/libelogind/sd-daemon/sd-daemon.c | 84 +++++++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 20 deletions(-) (limited to 'src/libelogind/sd-daemon') diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c index f74f44c65..c6224f8c7 100644 --- a/src/libelogind/sd-daemon/sd-daemon.c +++ b/src/libelogind/sd-daemon/sd-daemon.c @@ -19,27 +19,39 @@ along with systemd; If not, see . ***/ -#include -#include -#include -#include -#include #include -#include -#include -#include -#include -#include #include //#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -#include "util.h" #include "path-util.h" #include "socket-util.h" +//#include "strv.h" +#include "util.h" + #include "sd-daemon.h" /// UNNEEDED by elogind #if 0 +static void unsetenv_all(bool unset_environment) { + + if (!unset_environment) + return; + + unsetenv("LISTEN_PID"); + unsetenv("LISTEN_FDS"); + unsetenv("LISTEN_FDNAMES"); +} + _public_ int sd_listen_fds(int unset_environment) { const char *e; unsigned n; @@ -81,14 +93,51 @@ _public_ int sd_listen_fds(int unset_environment) { r = (int) n; finish: - if (unset_environment) { - unsetenv("LISTEN_PID"); - unsetenv("LISTEN_FDS"); + unsetenv_all(unset_environment); + return r; } +_public_ int sd_listen_fds_with_names(int unset_environment, char ***names) { + _cleanup_strv_free_ char **l = NULL; + bool have_names; + int n_names = 0, n_fds; + const char *e; + int r; + + if (!names) + return sd_listen_fds(unset_environment); + + e = getenv("LISTEN_FDNAMES"); + if (e) { + n_names = strv_split_extract(&l, e, ":", EXTRACT_DONT_COALESCE_SEPARATORS); + if (n_names < 0) { + unsetenv_all(unset_environment); + return n_names; + } + + have_names = true; + } else + have_names = false; + + n_fds = sd_listen_fds(unset_environment); + if (n_fds <= 0) + return n_fds; + + if (have_names) { + if (n_names != n_fds) + return -EINVAL; + } else { + r = strv_extend_n(&l, "unknown", n_fds); + if (r < 0) return r; } + *names = l; + l = NULL; + + return n_fds; +} + _public_ int sd_is_fifo(int fd, const char *path) { struct stat st_fd; @@ -511,16 +560,11 @@ _public_ int sd_notifyf(int unset_environment, const char *format, ...) { } _public_ int sd_booted(void) { - struct stat st; - /* We test whether the runtime unit file directory has been * created. This takes place in mount-setup.c, so is * guaranteed to happen very early during boot. */ - if (lstat("/run/systemd/system/", &st) < 0) - return 0; - - return !!S_ISDIR(st.st_mode); + return laccess("/run/systemd/system/", F_OK) >= 0; } #endif // 0 -- cgit v1.2.3 From 2e694aaeec158dba9dc12d8eea1755e201830a81 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Sun, 9 Apr 2017 20:56:14 +0200 Subject: Prep v227: Clean up some headers in src/systemd - src/systemd/sd-bus.h - src/systemd/sd-daemon.h - src/systemd/sd-event.h --- src/libelogind/sd-daemon/sd-daemon.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/libelogind/sd-daemon') diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c index c6224f8c7..b26ecf26d 100644 --- a/src/libelogind/sd-daemon/sd-daemon.c +++ b/src/libelogind/sd-daemon/sd-daemon.c @@ -513,9 +513,12 @@ finish: return r; } +/// UNNEEDED by elogind +#if 0 _public_ int sd_pid_notify(pid_t pid, int unset_environment, const char *state) { return sd_pid_notify_with_fds(pid, unset_environment, state, NULL, 0); } +#endif // 0 _public_ int sd_notify(int unset_environment, const char *state) { return sd_pid_notify_with_fds(0, unset_environment, state, NULL, 0); -- cgit v1.2.3