richardphibel / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
b11b5f
From 1f408c8d9739b1038012eeec7bf0f918c8095bc4 Mon Sep 17 00:00:00 2001
b11b5f
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
b11b5f
Date: Fri, 23 Sep 2022 19:00:22 +0200
b11b5f
Subject: [PATCH] core: respect SELinuxContext= for socket creation
b11b5f
b11b5f
On socket creation respect the SELinuxContext= setting of the associated
b11b5f
service, such that the initial created socket has the same label as the
b11b5f
future process accepting the connection (since w.r.t SELinux sockets
b11b5f
normally have the same label as the owning process).
b11b5f
b11b5f
Triggered by #24702
b11b5f
b11b5f
(cherry picked from commit 599b384924bbef9f8f7fa5700c6fa35a404d9a98)
b11b5f
b11b5f
Related: #2136738
b11b5f
---
b11b5f
 src/core/socket.c | 15 ++++++++++++++-
b11b5f
 1 file changed, 14 insertions(+), 1 deletion(-)
b11b5f
b11b5f
diff --git a/src/core/socket.c b/src/core/socket.c
b11b5f
index 9d47ca2616..d1ca0a07c5 100644
b11b5f
--- a/src/core/socket.c
b11b5f
+++ b/src/core/socket.c
b11b5f
@@ -1427,6 +1427,7 @@ fail:
b11b5f
 static int socket_determine_selinux_label(Socket *s, char **ret) {
b11b5f
         Service *service;
b11b5f
         ExecCommand *c;
b11b5f
+        const char *exec_context;
b11b5f
         _cleanup_free_ char *path = NULL;
b11b5f
         int r;
b11b5f
 
b11b5f
@@ -1448,8 +1449,20 @@ static int socket_determine_selinux_label(Socket *s, char **ret) {
b11b5f
 
b11b5f
                 if (!UNIT_ISSET(s->service))
b11b5f
                         goto no_label;
b11b5f
-
b11b5f
                 service = SERVICE(UNIT_DEREF(s->service));
b11b5f
+
b11b5f
+                exec_context = service->exec_context.selinux_context;
b11b5f
+                if (exec_context) {
b11b5f
+                        char *con;
b11b5f
+
b11b5f
+                        con = strdup(exec_context);
b11b5f
+                        if (!con)
b11b5f
+                                return -ENOMEM;
b11b5f
+
b11b5f
+                        *ret = TAKE_PTR(con);
b11b5f
+                        return 0;
b11b5f
+                }
b11b5f
+
b11b5f
                 c = service->exec_command[SERVICE_EXEC_START];
b11b5f
                 if (!c)
b11b5f
                         goto no_label;