[systemd-devel] [PATCH] manager: use CMSG macros
Shawn Landden
shawn at churchofgit.com
Sun Feb 2 12:18:55 PST 2014
---
src/core/manager.c | 29 +++++++++++++++++++++--------
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git a/src/core/manager.c b/src/core/manager.c
index 634b141..74fb52d 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -1275,9 +1275,10 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
};
union {
- struct cmsghdr cmsghdr;
+ struct msghdr msghdr;
uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
} control = {};
+ struct cmsghdr *cmsghdr;
struct msghdr msghdr = {
.msg_iov = &iovec,
@@ -1285,7 +1286,7 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
.msg_control = &control,
.msg_controllen = sizeof(control),
};
- struct ucred *ucred;
+ struct ucred *ucred = NULL;
Unit *u;
_cleanup_strv_free_ char **tags = NULL;
@@ -1300,15 +1301,27 @@ static int manager_dispatch_notify_fd(sd_event_source *source, int fd, uint32_t
return -errno;
}
- if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct ucred)) ||
- control.cmsghdr.cmsg_level != SOL_SOCKET ||
- control.cmsghdr.cmsg_type != SCM_CREDENTIALS ||
- control.cmsghdr.cmsg_len != CMSG_LEN(sizeof(struct ucred))) {
- log_warning("Received notify message without credentials. Ignoring.");
+ if (msghdr.msg_controllen < CMSG_LEN(sizeof(struct cmsghdr))) {
+ log_warning("sd_notify ancilliary message too short.");
continue;
}
- ucred = (struct ucred*) CMSG_DATA(&control.cmsghdr);
+ cmsghdr = CMSG_FIRSTHDR(&control.msghdr);
+ do {
+ if (cmsghdr->cmsg_level == SOL_SOCKET &&
+ cmsghdr->cmsg_type == SCM_CREDENTIALS &&
+ cmsghdr->cmsg_len == CMSG_LEN(sizeof(struct ucred)))
+ ucred = (struct ucred*) CMSG_DATA(cmsghdr);
+ else {
+ log_warning("Unrecognized sd_notify ancilliary message. Ignoring");
+ continue;
+ }
+ } while ((cmsghdr = CMSG_NXTHDR(&control.msghdr, cmsghdr)));
+
+ if (!ucred) {
+ log_warning("Received notify message without credentials. Ignoring.");
+ continue;
+ }
u = hashmap_get(m->watch_pids, LONG_TO_PTR(ucred->pid));
if (!u) {
--
1.8.5.2.297.g3e57c29
More information about the systemd-devel
mailing list