|
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
|