X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald-server.c;h=518e9ecc4ef7bf514685d7bcd9d2c57afa4b9e7c;hb=0b99c9f8f0cbfe9ab3de443cb6f94ecd7d21eae3;hp=cc8ce0dc0dd85de2e4f9d9755478c3d2f17f436d;hpb=4608af4333d0f7f5f8e3bc632801b04ef07d246d;p=elogind.git diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index cc8ce0dc0..518e9ecc4 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -51,6 +51,7 @@ #include "journald-stream.h" #include "journald-console.h" #include "journald-native.h" +#include "selinux-util.h" #ifdef HAVE_ACL #include @@ -321,8 +322,10 @@ void server_rotate(Server *s) { if (r < 0) if (f) log_error("Failed to rotate %s: %s", f->path, strerror(-r)); - else + else { log_error("Failed to create user journal: %s", strerror(-r)); + hashmap_remove(s->user_journals, k); + } else { hashmap_replace(s->user_journals, k, f); server_fix_perms(s, f, PTR_TO_UINT32(k)); @@ -627,19 +630,21 @@ static void dispatch_message_real( } #ifdef HAVE_SELINUX - if (label) { - x = alloca(sizeof("_SELINUX_CONTEXT=") + label_len); + if (use_selinux()) { + if (label) { + x = alloca(sizeof("_SELINUX_CONTEXT=") + label_len); - *((char*) mempcpy(stpcpy(x, "_SELINUX_CONTEXT="), label, label_len)) = 0; - IOVEC_SET_STRING(iovec[n++], x); - } else { - security_context_t con; + *((char*) mempcpy(stpcpy(x, "_SELINUX_CONTEXT="), label, label_len)) = 0; + IOVEC_SET_STRING(iovec[n++], x); + } else { + security_context_t con; - if (getpidcon(ucred->pid, &con) >= 0) { - x = strappenda("_SELINUX_CONTEXT=", con); + if (getpidcon(ucred->pid, &con) >= 0) { + x = strappenda("_SELINUX_CONTEXT=", con); - freecon(con); - IOVEC_SET_STRING(iovec[n++], x); + freecon(con); + IOVEC_SET_STRING(iovec[n++], x); + } } } #endif @@ -1060,7 +1065,8 @@ int process_event(Server *s, struct epoll_event *ev) { ssize_t n; if (ev->events != EPOLLIN) { - log_error("Got invalid event from epoll."); + log_error("Got invalid event from epoll for %s: %"PRIx32, + "signal fd", ev->events); return -EIO; } @@ -1113,8 +1119,12 @@ int process_event(Server *s, struct epoll_event *ev) { } else if (ev->data.fd == s->dev_kmsg_fd) { int r; - if (ev->events != EPOLLIN) { - log_error("Got invalid event from epoll."); + if (ev->events & EPOLLERR) + log_warning("/dev/kmsg buffer overrun, some messages lost."); + + if (!(ev->events & EPOLLIN)) { + log_error("Got invalid event from epoll for %s: %"PRIx32, + "/dev/kmsg", ev->events); return -EIO; } @@ -1128,18 +1138,20 @@ int process_event(Server *s, struct epoll_event *ev) { ev->data.fd == s->syslog_fd) { if (ev->events != EPOLLIN) { - log_error("Got invalid event from epoll."); + log_error("Got invalid event from epoll for %s: %"PRIx32, + ev->data.fd == s->native_fd ? "native fd" : "syslog fd", + ev->events); return -EIO; } for (;;) { - struct msghdr msghdr; - struct iovec iovec; struct ucred *ucred = NULL; struct timeval *tv = NULL; struct cmsghdr *cmsg; char *label = NULL; size_t label_len = 0; + + struct iovec iovec; union { struct cmsghdr cmsghdr; @@ -1156,7 +1168,14 @@ int process_event(Server *s, struct epoll_event *ev) { CMSG_SPACE(sizeof(struct timeval)) + CMSG_SPACE(sizeof(int)) + /* fd */ CMSG_SPACE(NAME_MAX)]; /* selinux label */ - } control; + } control = {}; + struct msghdr msghdr = { + .msg_iov = &iovec, + .msg_iovlen = 1, + .msg_control = &control, + .msg_controllen = sizeof(control), + }; + ssize_t n; int v; int *fds = NULL; @@ -1167,36 +1186,14 @@ int process_event(Server *s, struct epoll_event *ev) { return -errno; } - if (s->buffer_size < (size_t) v) { - void *b; - size_t l; - - l = MAX(LINE_MAX + (size_t) v, s->buffer_size * 2); - b = realloc(s->buffer, l+1); - - if (!b) { - log_error("Couldn't increase buffer."); - return -ENOMEM; - } - - s->buffer_size = l; - s->buffer = b; - } + if (!GREEDY_REALLOC(s->buffer, s->buffer_size, LINE_MAX + (size_t) v)) + return log_oom(); - zero(iovec); iovec.iov_base = s->buffer; iovec.iov_len = s->buffer_size; - zero(control); - zero(msghdr); - msghdr.msg_iov = &iovec; - msghdr.msg_iovlen = 1; - msghdr.msg_control = &control; - msghdr.msg_controllen = sizeof(control); - n = recvmsg(ev->data.fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC); if (n < 0) { - if (errno == EINTR || errno == EAGAIN) return 1; @@ -1249,7 +1246,8 @@ int process_event(Server *s, struct epoll_event *ev) { } else if (ev->data.fd == s->stdout_fd) { if (ev->events != EPOLLIN) { - log_error("Got invalid event from epoll."); + log_error("Got invalid event from epoll for %s: %"PRIx32, + "stdout fd", ev->events); return -EIO; } @@ -1260,7 +1258,8 @@ int process_event(Server *s, struct epoll_event *ev) { StdoutStream *stream; if ((ev->events|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) { - log_error("Got invalid event from epoll."); + log_error("Got invalid event from epoll for %s: %"PRIx32, + "stdout stream", ev->events); return -EIO; }