|
Zbigniew Jędrzejewski-Szmek |
436654 |
From 6829b6250d10c3a6a773374bffc58ec8cc98bc36 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 21:24:45 -0400
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
Subject: [PATCH] sd-bus: store selinux context at connection time
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
This appears to be the right time to do it for SOCK_STREAM
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
unix sockets.
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
Also: condition bus_get_owner_creds_dbus1 was reversed. Split
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
it out to a separate variable for clarity and fix.
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
https://bugzilla.redhat.com/show_bug.cgi?id=1224211
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
(cherry picked from commit c4e6556c46cea1b7195cfb81c8cfab8342ebd852)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
Conflicts:
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
src/libsystemd/sd-bus/bus-control.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
src/libsystemd/sd-bus/bus-control.c | 6 ++++--
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
src/libsystemd/sd-bus/bus-internal.h | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
src/libsystemd/sd-bus/bus-socket.c | 7 +++++++
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
src/libsystemd/sd-bus/sd-bus.c | 1 +
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
4 files changed, 13 insertions(+), 3 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
diff --git a/src/libsystemd/sd-bus/bus-control.c b/src/libsystemd/sd-bus/bus-control.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
index b4ca177f76..1103903358 100644
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
--- a/src/libsystemd/sd-bus/bus-control.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+++ b/src/libsystemd/sd-bus/bus-control.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
@@ -979,8 +979,10 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
_cleanup_bus_creds_unref_ sd_bus_creds *c = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
pid_t pid = 0;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ bool do_label = bus->label && (mask & SD_BUS_CREDS_SELINUX_CONTEXT);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
- if (!bus->ucred_valid && isempty(bus->label))
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ /* Avoid allocating anything if we have no chance of returning useful data */
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ if (!bus->ucred_valid && !do_label)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
return -ENODATA;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
c = bus_creds_new();
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
@@ -1004,7 +1006,7 @@ static int bus_get_owner_creds_dbus1(sd_bus *bus, uint64_t mask, sd_bus_creds **
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
- if (!isempty(bus->label) && (mask & SD_BUS_CREDS_SELINUX_CONTEXT)) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ if (do_label) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
c->label = strdup(bus->label);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
if (!c->label)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
return -ENOMEM;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
index 1351938c80..2ee0eabc02 100644
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
--- a/src/libsystemd/sd-bus/bus-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+++ b/src/libsystemd/sd-bus/bus-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
@@ -261,7 +261,7 @@ struct sd_bus {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
usec_t auth_timeout;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
struct ucred ucred;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
- char label[NAME_MAX];
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ char *label;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
uint64_t creds_mask;
|
|
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 ec4fcfbcd3..1fde95d2e8 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 |
@@ -587,10 +587,17 @@ void bus_socket_setup(sd_bus *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
static void bus_get_peercred(sd_bus *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ int r;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
assert(b);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
/* Get the peer for socketpair() sockets */
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
b->ucred_valid = getpeercred(b->input_fd, &b->ucred) >= 0;
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ /* Get the SELinux context of the peer */
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ r = getpeersec(b->input_fd, &b->label);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ if (r < 0 && r != -EOPNOTSUPP)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ log_debug_errno(r, "Failed to determine peer security context: %m");
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
static int bus_socket_start_auth_client(sd_bus *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
index 214b3d04df..ef0f51be53 100644
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
--- a/src/libsystemd/sd-bus/sd-bus.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+++ b/src/libsystemd/sd-bus/sd-bus.c
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
@@ -116,6 +116,7 @@ static void bus_free(sd_bus *b) {
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
if (b->kdbus_buffer)
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
munmap(b->kdbus_buffer, KDBUS_POOL_SIZE);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
+ free(b->label);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
free(b->rbuffer);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
free(b->unique_name);
|
|
Zbigniew Jędrzejewski-Szmek |
436654 |
free(b->auth_buffer);
|