|
|
1ff636 |
From d0986e46b74de3b131fccbf79bd00de5ff054f71 Mon Sep 17 00:00:00 2001
|
|
|
1ff636 |
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
|
|
1ff636 |
Date: Sat, 6 Jun 2015 18:59:27 -0400
|
|
|
1ff636 |
Subject: [PATCH] sd-bus: do not use per-datagram auxiliary information
|
|
|
1ff636 |
|
|
|
1ff636 |
SELinux information cannot be retrieved this way, since we are
|
|
|
1ff636 |
using stream unix sockets and SCM_SECURITY does not work for
|
|
|
1ff636 |
them.
|
|
|
1ff636 |
|
|
|
1ff636 |
SCM_CREDENTIALS use dropped to be consistent. We also should
|
|
|
1ff636 |
get this information at connection time.
|
|
|
1ff636 |
|
|
|
1ff636 |
https://bugzilla.redhat.com/show_bug.cgi?id=1224211
|
|
|
1ff636 |
"SCM_SECURITY was only added for datagram sockets."
|
|
|
1ff636 |
|
|
|
1ff636 |
Cherry-picked from: d868f2a
|
|
|
1ff636 |
Related: #1230190
|
|
|
1ff636 |
---
|
|
|
1ff636 |
src/libsystemd/sd-bus/bus-socket.c | 70 +++++++-------------------------------
|
|
|
1ff636 |
1 file changed, 12 insertions(+), 58 deletions(-)
|
|
|
1ff636 |
|
|
|
1ff636 |
diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c
|
|
|
181b3f |
index 52883fa8c..abd9ece01 100644
|
|
|
1ff636 |
--- a/src/libsystemd/sd-bus/bus-socket.c
|
|
|
1ff636 |
+++ b/src/libsystemd/sd-bus/bus-socket.c
|
|
|
1ff636 |
@@ -501,9 +501,7 @@ static int bus_socket_read_auth(sd_bus *b) {
|
|
|
1ff636 |
void *p;
|
|
|
1ff636 |
union {
|
|
|
1ff636 |
struct cmsghdr cmsghdr;
|
|
|
1ff636 |
- uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
|
|
|
1ff636 |
- CMSG_SPACE(sizeof(struct ucred)) +
|
|
|
1ff636 |
- CMSG_SPACE(NAME_MAX)]; /*selinux label */
|
|
|
1ff636 |
+ uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
|
|
|
1ff636 |
} control;
|
|
|
1ff636 |
struct cmsghdr *cmsg;
|
|
|
1ff636 |
bool handle_cmsg = false;
|
|
|
1ff636 |
@@ -556,8 +554,8 @@ static int bus_socket_read_auth(sd_bus *b) {
|
|
|
1ff636 |
|
|
|
1ff636 |
b->rbuffer_size += k;
|
|
|
1ff636 |
|
|
|
1ff636 |
- if (handle_cmsg) {
|
|
|
1ff636 |
- for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
|
|
|
1ff636 |
+ if (handle_cmsg)
|
|
|
1ff636 |
+ for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
|
|
|
1ff636 |
if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
cmsg->cmsg_type == SCM_RIGHTS) {
|
|
|
1ff636 |
int j;
|
|
|
1ff636 |
@@ -568,31 +566,9 @@ static int bus_socket_read_auth(sd_bus *b) {
|
|
|
1ff636 |
j = (cmsg->cmsg_len - CMSG_LEN(0)) / sizeof(int);
|
|
|
1ff636 |
close_many((int*) CMSG_DATA(cmsg), j);
|
|
|
1ff636 |
return -EIO;
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- } else if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
- cmsg->cmsg_type == SCM_CREDENTIALS &&
|
|
|
1ff636 |
- cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- /* Ignore bogus data, which we might
|
|
|
1ff636 |
- * get on socketpair() sockets */
|
|
|
1ff636 |
- if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
|
|
|
1ff636 |
- memcpy(&b->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
|
|
|
1ff636 |
- b->ucred_valid = true;
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- } else if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
- cmsg->cmsg_type == SCM_SECURITY) {
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- size_t l;
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- l = cmsg->cmsg_len - CMSG_LEN(0);
|
|
|
1ff636 |
- if (l > 0) {
|
|
|
1ff636 |
- memcpy(&b->label, CMSG_DATA(cmsg), l);
|
|
|
1ff636 |
- b->label[l] = 0;
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
+ } else
|
|
|
1ff636 |
+ log_debug("Got unexpected auxiliary data with level=%d and type=%d",
|
|
|
1ff636 |
+ cmsg->cmsg_level, cmsg->cmsg_type);
|
|
|
1ff636 |
|
|
|
1ff636 |
r = bus_socket_auth_verify(b);
|
|
|
1ff636 |
if (r != 0)
|
|
|
1ff636 |
@@ -945,9 +921,7 @@ int bus_socket_read_message(sd_bus *bus) {
|
|
|
1ff636 |
void *b;
|
|
|
1ff636 |
union {
|
|
|
1ff636 |
struct cmsghdr cmsghdr;
|
|
|
1ff636 |
- uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX) +
|
|
|
1ff636 |
- CMSG_SPACE(sizeof(struct ucred)) +
|
|
|
1ff636 |
- CMSG_SPACE(NAME_MAX)]; /*selinux label */
|
|
|
1ff636 |
+ uint8_t buf[CMSG_SPACE(sizeof(int) * BUS_FDS_MAX)];
|
|
|
1ff636 |
} control;
|
|
|
1ff636 |
struct cmsghdr *cmsg;
|
|
|
1ff636 |
bool handle_cmsg = false;
|
|
|
1ff636 |
@@ -995,8 +969,8 @@ int bus_socket_read_message(sd_bus *bus) {
|
|
|
1ff636 |
|
|
|
1ff636 |
bus->rbuffer_size += k;
|
|
|
1ff636 |
|
|
|
1ff636 |
- if (handle_cmsg) {
|
|
|
1ff636 |
- for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg)) {
|
|
|
1ff636 |
+ if (handle_cmsg)
|
|
|
1ff636 |
+ for (cmsg = CMSG_FIRSTHDR(&mh); cmsg; cmsg = CMSG_NXTHDR(&mh, cmsg))
|
|
|
1ff636 |
if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
cmsg->cmsg_type == SCM_RIGHTS) {
|
|
|
1ff636 |
int n, *f;
|
|
|
1ff636 |
@@ -1021,29 +995,9 @@ int bus_socket_read_message(sd_bus *bus) {
|
|
|
1ff636 |
memcpy(f + bus->n_fds, CMSG_DATA(cmsg), n * sizeof(int));
|
|
|
1ff636 |
bus->fds = f;
|
|
|
1ff636 |
bus->n_fds += n;
|
|
|
1ff636 |
- } else if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
- cmsg->cmsg_type == SCM_CREDENTIALS &&
|
|
|
1ff636 |
- cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- /* Ignore bogus data, which we might
|
|
|
1ff636 |
- * get on socketpair() sockets */
|
|
|
1ff636 |
- if (((struct ucred*) CMSG_DATA(cmsg))->pid != 0) {
|
|
|
1ff636 |
- memcpy(&bus->ucred, CMSG_DATA(cmsg), sizeof(struct ucred));
|
|
|
1ff636 |
- bus->ucred_valid = true;
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- } else if (cmsg->cmsg_level == SOL_SOCKET &&
|
|
|
1ff636 |
- cmsg->cmsg_type == SCM_SECURITY) {
|
|
|
1ff636 |
-
|
|
|
1ff636 |
- size_t l;
|
|
|
1ff636 |
- l = cmsg->cmsg_len - CMSG_LEN(0);
|
|
|
1ff636 |
- if (l > 0) {
|
|
|
1ff636 |
- memcpy(&bus->label, CMSG_DATA(cmsg), l);
|
|
|
1ff636 |
- bus->label[l] = 0;
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
- }
|
|
|
1ff636 |
+ } else
|
|
|
1ff636 |
+ log_debug("Got unexpected auxiliary data with level=%d and type=%d",
|
|
|
1ff636 |
+ cmsg->cmsg_level, cmsg->cmsg_type);
|
|
|
1ff636 |
|
|
|
1ff636 |
r = bus_socket_read_message_need(bus, &need);
|
|
|
1ff636 |
if (r < 0)
|