9fc0f6
From 4083e4d76b61bc9eb40583f941412c1ea1a0285b Mon Sep 17 00:00:00 2001
9fc0f6
From: Colin Walters <walters@verbum.org>
9fc0f6
Date: Fri, 21 Feb 2014 03:29:00 +0100
9fc0f6
Subject: [PATCH] selinux: Don't attempt to load policy in initramfs if it
9fc0f6
 doesn't exist
9fc0f6
9fc0f6
Currently on at least Fedora, SELinux policy does not come in the
9fc0f6
initramfs.  systemd will attempt to load *both* in the initramfs and
9fc0f6
in the real root.
9fc0f6
9fc0f6
Now, the selinux_init_load_policy() API has a regular error return
9fc0f6
value, as well as an "enforcing" boolean.  To determine enforcing
9fc0f6
state, it looks for /etc/selinux/config as well as the presence of
9fc0f6
"enforcing=" on the kernel command line.
9fc0f6
9fc0f6
Ordinarily, neither of those exist in the initramfs, so it will return
9fc0f6
"unknown" for enforcing, and systemd will simply ignore the failure to
9fc0f6
load policy.
9fc0f6
---
9fc0f6
 src/core/selinux-setup.c | 7 +++++++
9fc0f6
 1 file changed, 7 insertions(+)
9fc0f6
9fc0f6
diff --git a/src/core/selinux-setup.c b/src/core/selinux-setup.c
9fc0f6
index 7a32ed5..9a5d6b2 100644
9fc0f6
--- a/src/core/selinux-setup.c
9fc0f6
+++ b/src/core/selinux-setup.c
9fc0f6
@@ -58,6 +58,13 @@ int selinux_setup(bool *loaded_policy) {
9fc0f6
        cb.func_log = null_log;
9fc0f6
        selinux_set_callback(SELINUX_CB_LOG, cb);
9fc0f6
 
9fc0f6
+       /* Don't load policy in the initrd if we don't appear to have
9fc0f6
+        * it.  For the real root, we check below if we've already
9fc0f6
+        * loaded policy, and return gracefully.
9fc0f6
+        */
9fc0f6
+       if (in_initrd() && access(selinux_path(), F_OK) < 0)
9fc0f6
+               return 0;
9fc0f6
+
9fc0f6
        /* Already initialized by somebody else? */
9fc0f6
        r = getcon_raw(&con);
9fc0f6
        if (r == 0) {