Zbigniew Jędrzejewski-Szmek a734fa
From bef6d96b5aa48ce4b90633c847158f0ae27c7a10 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek a734fa
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek a734fa
Date: Tue, 27 Oct 2020 19:47:26 +0100
Zbigniew Jędrzejewski-Szmek a734fa
Subject: [PATCH] selinux: fall back to the netlink-based API
Zbigniew Jędrzejewski-Szmek a734fa
Zbigniew Jędrzejewski-Szmek a734fa
Fedora Rawhide still has the old policy, so selinux prevents our selinux code
Zbigniew Jędrzejewski-Szmek a734fa
from checking if selinux is enabled. But it seems smart to fall back to the old
Zbigniew Jędrzejewski-Szmek a734fa
API anyway.
Zbigniew Jędrzejewski-Szmek a734fa
Zbigniew Jędrzejewski-Szmek a734fa
Follow-up for fd5e402fa9377f2860e02bdb5b84d5f5942e73f4.
Zbigniew Jędrzejewski-Szmek a734fa
---
Zbigniew Jędrzejewski-Szmek a734fa
 src/basic/selinux-util.c | 24 ++++++++++++++++--------
Zbigniew Jędrzejewski-Szmek a734fa
 1 file changed, 16 insertions(+), 8 deletions(-)
Zbigniew Jędrzejewski-Szmek a734fa
Zbigniew Jędrzejewski-Szmek a734fa
diff --git a/src/basic/selinux-util.c b/src/basic/selinux-util.c
Zbigniew Jędrzejewski-Szmek a734fa
index 1791aeecde..c239634e48 100644
Zbigniew Jędrzejewski-Szmek a734fa
--- a/src/basic/selinux-util.c
Zbigniew Jędrzejewski-Szmek a734fa
+++ b/src/basic/selinux-util.c
Zbigniew Jędrzejewski-Szmek a734fa
@@ -133,6 +133,7 @@ static int open_label_db(void) {
Zbigniew Jędrzejewski-Szmek a734fa
 int mac_selinux_init(void) {
Zbigniew Jędrzejewski-Szmek a734fa
 #if HAVE_SELINUX
Zbigniew Jędrzejewski-Szmek a734fa
         int r;
Zbigniew Jędrzejewski-Szmek a734fa
+        bool have_status_page = false;
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
         if (initialized)
Zbigniew Jędrzejewski-Szmek a734fa
                 return 0;
Zbigniew Jędrzejewski-Szmek a734fa
@@ -140,9 +141,15 @@ int mac_selinux_init(void) {
Zbigniew Jędrzejewski-Szmek a734fa
         if (!mac_selinux_use())
Zbigniew Jędrzejewski-Szmek a734fa
                 return 0;
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
-        r = selinux_status_open(/* no netlink fallback */ 0);
Zbigniew Jędrzejewski-Szmek a734fa
-        if (r < 0)
Zbigniew Jędrzejewski-Szmek a734fa
-                return log_enforcing_errno(errno, "Failed to open SELinux status page: %m");
Zbigniew Jędrzejewski-Szmek a734fa
+        r = selinux_status_open(/* netlink fallback */ 1);
Zbigniew Jędrzejewski-Szmek a734fa
+        if (r < 0) {
Zbigniew Jędrzejewski-Szmek a734fa
+                if (!ERRNO_IS_PRIVILEGE(errno))
Zbigniew Jędrzejewski-Szmek a734fa
+                        return log_enforcing_errno(errno, "Failed to open SELinux status page: %m");
Zbigniew Jędrzejewski-Szmek a734fa
+                log_warning_errno(errno, "selinux_status_open() failed, using the netlink fallback: %m");
Zbigniew Jędrzejewski-Szmek a734fa
+        } else if (r == 1)
Zbigniew Jędrzejewski-Szmek a734fa
+                log_warning("selinux_status_open() failed to open the status page, using the netlink fallback.");
Zbigniew Jędrzejewski-Szmek a734fa
+        else
Zbigniew Jędrzejewski-Szmek a734fa
+                have_status_page = true;
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
         r = open_label_db();
Zbigniew Jędrzejewski-Szmek a734fa
         if (r < 0) {
Zbigniew Jędrzejewski-Szmek a734fa
@@ -150,13 +157,14 @@ int mac_selinux_init(void) {
Zbigniew Jędrzejewski-Szmek a734fa
                 return r;
Zbigniew Jędrzejewski-Szmek a734fa
         }
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
-        /* save the current policyload sequence number, so `mac_selinux_maybe_reload()` does
Zbigniew Jędrzejewski-Szmek a734fa
-           not trigger on first call without any actual change */
Zbigniew Jędrzejewski-Szmek a734fa
+        /* Save the current policyload sequence number, so mac_selinux_maybe_reload() does not trigger on
Zbigniew Jędrzejewski-Szmek a734fa
+         * first call without any actual change. */
Zbigniew Jędrzejewski-Szmek a734fa
         last_policyload = selinux_status_policyload();
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
-        /* now that the SELinux status page has been successfully opened,
Zbigniew Jędrzejewski-Szmek a734fa
-           retrieve the enforcing status over it (to avoid system calls in `security_getenforce()`) */
Zbigniew Jędrzejewski-Szmek a734fa
-        enforcing_status_func = selinux_status_getenforce;
Zbigniew Jędrzejewski-Szmek a734fa
+        if (have_status_page)
Zbigniew Jędrzejewski-Szmek a734fa
+                /* Now that the SELinux status page has been successfully opened, retrieve the enforcing
Zbigniew Jędrzejewski-Szmek a734fa
+                 * status over it (to avoid system calls in security_getenforce()). */
Zbigniew Jędrzejewski-Szmek a734fa
+                enforcing_status_func = selinux_status_getenforce;
Zbigniew Jędrzejewski-Szmek a734fa
 
Zbigniew Jędrzejewski-Szmek a734fa
         initialized = true;
Zbigniew Jędrzejewski-Szmek a734fa
 #endif