Zbigniew Jędrzejewski-Szmek 436654
From 81eb1e9e46b569992b265e826ffc0218ee3d99dd Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 436654
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 436654
Date: Sat, 6 Jun 2015 18:59:27 -0400
Zbigniew Jędrzejewski-Szmek 436654
Subject: [PATCH] sd-bus: do not use per-datagram auxiliary information
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
SELinux information cannot be retrieved this way, since we are
Zbigniew Jędrzejewski-Szmek 436654
using stream unix sockets and SCM_SECURITY does not work for
Zbigniew Jędrzejewski-Szmek 436654
them.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
SCM_CREDENTIALS use dropped to be consistent. We also should
Zbigniew Jędrzejewski-Szmek 436654
get this information at connection time.
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
https://bugzilla.redhat.com/show_bug.cgi?id=1224211
Zbigniew Jędrzejewski-Szmek 436654
"SCM_SECURITY was only added for datagram sockets."
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
(cherry picked from commit d868f2a3a1cc97b1e081b7692e80a1182efccda4)
Zbigniew Jędrzejewski-Szmek 436654
---
Zbigniew Jędrzejewski-Szmek 436654
 src/libsystemd/sd-bus/bus-socket.c | 80 ++++++--------------------------------
Zbigniew Jędrzejewski-Szmek 436654
 1 file changed, 12 insertions(+), 68 deletions(-)
Zbigniew Jędrzejewski-Szmek 436654
Zbigniew Jędrzejewski-Szmek 436654
diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
Zbigniew Jędrzejewski-Szmek 436654
index e00bd3fc55..ec4fcfbcd3 100644
Zbigniew Jędrzejewski-Szmek 436654
--- a/src/libsystemd/sd-bus/bus-socket.c
Zbigniew Jędrzejewski-Szmek 436654
+++ b/src/libsystemd/sd-bus/bus-socket.c
Zbigniew Jędrzejewski-Szmek 436654
@@ -499,9 +499,7 @@ static int bus_socket_read_auth(sd_bus *b) {
Zbigniew Jędrzejewski-Szmek 436654
         void *p;
Zbigniew Jędrzejewski-Szmek 436654
         union {
Zbigniew Jędrzejewski-Szmek 436654
                 struct cmsghdr cmsghdr;
Zbigniew Jędrzejewski-Szmek 436654
-                uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
Zbigniew Jędrzejewski-Szmek 436654
-                            CMSG_SPACE(sizeof(struct ucred)) +
Zbigniew Jędrzejewski-Szmek 436654
-                            CMSG_SPACE(NAME_MAX)]; /*selinux label */
Zbigniew Jędrzejewski-Szmek 436654
+                uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
Zbigniew Jędrzejewski-Szmek 436654
         } control;
Zbigniew Jędrzejewski-Szmek 436654
         struct cmsghdr *cmsg;
Zbigniew Jędrzejewski-Szmek 436654
         bool handle_cmsg = false;
Zbigniew Jędrzejewski-Szmek 436654
@@ -553,8 +551,8 @@ static int bus_socket_read_auth(sd_bus *b) {
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         b->rbuffer_size += k;
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
-        if (handle_cmsg) {
Zbigniew Jędrzejewski-Szmek 436654
-                for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
Zbigniew Jędrzejewski-Szmek 436654
+        if (handle_cmsg)
Zbigniew Jędrzejewski-Szmek 436654
+                for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
Zbigniew Jędrzejewski-Szmek 436654
                         if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
                             cmsg->cmsg_type == SCM_RIGHTS) {
Zbigniew Jędrzejewski-Szmek 436654
                                 int j;
Zbigniew Jędrzejewski-Szmek 436654
@@ -565,31 +563,9 @@ static int bus_socket_read_auth(sd_bus *b) {
Zbigniew Jędrzejewski-Szmek 436654
                                 j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
Zbigniew Jędrzejewski-Szmek 436654
                                 close_many((int*) CMSG_DATA(cmsg), j);
Zbigniew Jędrzejewski-Szmek 436654
                                 return -EIO;
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                        } else if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_type == SCM_CREDENTIALS &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                                /* Ignore bogus data, which we might
Zbigniew Jędrzejewski-Szmek 436654
-                                 * get on socketpair() sockets */
Zbigniew Jędrzejewski-Szmek 436654
-                                if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
Zbigniew Jędrzejewski-Szmek 436654
-                                        memcpy(&b->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
Zbigniew Jędrzejewski-Szmek 436654
-                                        b->ucred_valid = true;
Zbigniew Jędrzejewski-Szmek 436654
-                                }
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                        } else if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_type == SCM_SECURITY) {
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                                size_t l;
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                                l = cmsg->cmsg_len - CMSG_LEN(0);
Zbigniew Jędrzejewski-Szmek 436654
-                                if (l > 0) {
Zbigniew Jędrzejewski-Szmek 436654
-                                        memcpy(&b->label, CMSG_DATA(cmsg), l);
Zbigniew Jędrzejewski-Szmek 436654
-                                        b->label[l] = 0;
Zbigniew Jędrzejewski-Szmek 436654
-                                }
Zbigniew Jędrzejewski-Szmek 436654
-                        }
Zbigniew Jędrzejewski-Szmek 436654
-                }
Zbigniew Jędrzejewski-Szmek 436654
-        }
Zbigniew Jędrzejewski-Szmek 436654
+                        } else
Zbigniew Jędrzejewski-Szmek 436654
+                                log_debug("Got unexpected auxiliary data with level=%d and type=%d",
Zbigniew Jędrzejewski-Szmek 436654
+                                          cmsg->cmsg_level, cmsg->cmsg_type);
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         r = bus_socket_auth_verify(b);
Zbigniew Jędrzejewski-Szmek 436654
         if (r != 0)
Zbigniew Jędrzejewski-Szmek 436654
@@ -599,18 +575,8 @@ static int bus_socket_read_auth(sd_bus *b) {
Zbigniew Jędrzejewski-Szmek 436654
 }
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
 void bus_socket_setup(sd_bus *b) {
Zbigniew Jędrzejewski-Szmek 436654
-        int enable;
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
         assert(b);
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
-        /* Enable SO_PASSCRED + SO_PASSEC. We try this on any
Zbigniew Jędrzejewski-Szmek 436654
-         * socket, just in case. */
Zbigniew Jędrzejewski-Szmek 436654
-        enable = !b->bus_client;
Zbigniew Jędrzejewski-Szmek 436654
-        (void) setsockopt(b->input_fd, SOL_SOCKET, SO_PASSCRED, &enable, sizeof(enable));
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-        enable = !b->bus_client && (b->attach_flags & KDBUS_ATTACH_SECLABEL);
Zbigniew Jędrzejewski-Szmek 436654
-        (void) setsockopt(b->input_fd, SOL_SOCKET, SO_PASSSEC, &enable, sizeof(enable));
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
         /* Increase the buffers to 8 MB */
Zbigniew Jędrzejewski-Szmek 436654
         fd_inc_rcvbuf(b->input_fd, SNDBUF_SIZE);
Zbigniew Jędrzejewski-Szmek 436654
         fd_inc_sndbuf(b->output_fd, SNDBUF_SIZE);
Zbigniew Jędrzejewski-Szmek 436654
@@ -939,9 +905,7 @@ int bus_socket_read_message(sd_bus *bus) {
Zbigniew Jędrzejewski-Szmek 436654
         void *b;
Zbigniew Jędrzejewski-Szmek 436654
         union {
Zbigniew Jędrzejewski-Szmek 436654
                 struct cmsghdr cmsghdr;
Zbigniew Jędrzejewski-Szmek 436654
-                uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
Zbigniew Jędrzejewski-Szmek 436654
-                            CMSG_SPACE(sizeof(struct ucred)) +
Zbigniew Jędrzejewski-Szmek 436654
-                            CMSG_SPACE(NAME_MAX)]; /*selinux label */
Zbigniew Jędrzejewski-Szmek 436654
+                uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
Zbigniew Jędrzejewski-Szmek 436654
         } control;
Zbigniew Jędrzejewski-Szmek 436654
         struct cmsghdr *cmsg;
Zbigniew Jędrzejewski-Szmek 436654
         bool handle_cmsg = false;
Zbigniew Jędrzejewski-Szmek 436654
@@ -988,8 +952,8 @@ int bus_socket_read_message(sd_bus *bus) {
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         bus->rbuffer_size += k;
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
-        if (handle_cmsg) {
Zbigniew Jędrzejewski-Szmek 436654
-                for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
Zbigniew Jędrzejewski-Szmek 436654
+        if (handle_cmsg)
Zbigniew Jędrzejewski-Szmek 436654
+                for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
Zbigniew Jędrzejewski-Szmek 436654
                         if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
                             cmsg->cmsg_type == SCM_RIGHTS) {
Zbigniew Jędrzejewski-Szmek 436654
                                 int n, *f;
Zbigniew Jędrzejewski-Szmek 436654
@@ -1014,29 +978,9 @@ int bus_socket_read_message(sd_bus *bus) {
Zbigniew Jędrzejewski-Szmek 436654
                                 memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
Zbigniew Jędrzejewski-Szmek 436654
                                 bus->fds = f;
Zbigniew Jędrzejewski-Szmek 436654
                                 bus->n_fds += n;
Zbigniew Jędrzejewski-Szmek 436654
-                        } else if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_type == SCM_CREDENTIALS &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                                /* Ignore bogus data, which we might
Zbigniew Jędrzejewski-Szmek 436654
-                                 * get on socketpair() sockets */
Zbigniew Jędrzejewski-Szmek 436654
-                                if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
Zbigniew Jędrzejewski-Szmek 436654
-                                        memcpy(&bus->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
Zbigniew Jędrzejewski-Szmek 436654
-                                        bus->ucred_valid = true;
Zbigniew Jędrzejewski-Szmek 436654
-                                }
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                        } else if (cmsg->cmsg_level == SOL_SOCKET &&
Zbigniew Jędrzejewski-Szmek 436654
-                                   cmsg->cmsg_type == SCM_SECURITY) {
Zbigniew Jędrzejewski-Szmek 436654
-
Zbigniew Jędrzejewski-Szmek 436654
-                                size_t l;
Zbigniew Jędrzejewski-Szmek 436654
-                                l = cmsg->cmsg_len - CMSG_LEN(0);
Zbigniew Jędrzejewski-Szmek 436654
-                                if (l > 0) {
Zbigniew Jędrzejewski-Szmek 436654
-                                        memcpy(&bus->label, CMSG_DATA(cmsg), l);
Zbigniew Jędrzejewski-Szmek 436654
-                                        bus->label[l] = 0;
Zbigniew Jędrzejewski-Szmek 436654
-                                }
Zbigniew Jędrzejewski-Szmek 436654
-                        }
Zbigniew Jędrzejewski-Szmek 436654
-                }
Zbigniew Jędrzejewski-Szmek 436654
-        }
Zbigniew Jędrzejewski-Szmek 436654
+                        } else
Zbigniew Jędrzejewski-Szmek 436654
+                                log_debug("Got unexpected auxiliary data with level=%d and type=%d",
Zbigniew Jędrzejewski-Szmek 436654
+                                          cmsg->cmsg_level, cmsg->cmsg_type);
Zbigniew Jędrzejewski-Szmek 436654
 
Zbigniew Jędrzejewski-Szmek 436654
         r = bus_socket_read_message_need(bus, &need);
Zbigniew Jędrzejewski-Szmek 436654
         if (r < 0)