22e5820
From 78a08d30b5fbf6e1e3b589e0cf67022e0c1faa33 Mon Sep 17 00:00:00 2001
22e5820
From: =?UTF-8?q?Michal=20=C5=BDidek?= <mzidek@redhat.com>
22e5820
Date: Wed, 8 Feb 2017 12:01:37 +0100
22e5820
Subject: [PATCH] selinux: Do not fail if SELinux is not managed
22e5820
MIME-Version: 1.0
22e5820
Content-Type: text/plain; charset=UTF-8
22e5820
Content-Transfer-Encoding: 8bit
22e5820
22e5820
Previously we failed if semanage_is_managed returned 0 or -1 (not
22e5820
managed or error). With this patch we only fail in case of error and
22e5820
continue normally if selinux is not managed by libsemanage at all.
22e5820
22e5820
Resolves:
22e5820
https://fedorahosted.org/sssd/ticket/3297
22e5820
22e5820
Reviewed-by: Lukáš Slebodník <lslebodn@redhat.com>
22e5820
---
22e5820
 Makefile.am                       |  1 +
22e5820
 src/providers/ipa/selinux_child.c |  9 ++++--
22e5820
 src/util/sss_semanage.c           | 61 +++++++++++++++++++++++++--------------
22e5820
 src/util/util_errors.c            |  1 +
22e5820
 src/util/util_errors.h            |  1 +
22e5820
 5 files changed, 49 insertions(+), 24 deletions(-)
22e5820
22e5820
diff --git a/Makefile.am b/Makefile.am
22e5820
index 5264183cd199be464e5e99d2ab31ba4fcd77c5ec..d45c0ff757dfae378c71c6f8850fddce2c61cad8 100644
22e5820
--- a/Makefile.am
22e5820
+++ b/Makefile.am
22e5820
@@ -4040,6 +4040,7 @@ selinux_child_SOURCES = \
22e5820
     src/util/atomic_io.c \
22e5820
     src/util/util.c \
22e5820
     src/util/util_ext.c \
22e5820
+    src/util/util_errors.c
22e5820
     $(NULL)
22e5820
 selinux_child_CFLAGS = \
22e5820
     $(AM_CFLAGS) \
22e5820
diff --git a/src/providers/ipa/selinux_child.c b/src/providers/ipa/selinux_child.c
22e5820
index 380005c7ad3269fc8113c62ceef30b076455b5dd..f8dd3954a7244df2dcbb910aabf8888f41306c09 100644
22e5820
--- a/src/providers/ipa/selinux_child.c
22e5820
+++ b/src/providers/ipa/selinux_child.c
22e5820
@@ -174,14 +174,19 @@ static bool seuser_needs_update(struct input_buffer *ibuf)
22e5820
 
22e5820
     ret = get_seuser(ibuf, ibuf->username, &db_seuser, &db_mls_range);
22e5820
     DEBUG(SSSDBG_TRACE_INTERNAL,
22e5820
-          "get_seuser: ret: %d seuser: %s mls: %s\n",
22e5820
-          ret, db_seuser ? db_seuser : "unknown",
22e5820
+          "get_seuser: ret: %d msg: [%s] seuser: %s mls: %s\n",
22e5820
+          ret, sss_strerror(ret),
22e5820
+          db_seuser ? db_seuser : "unknown",
22e5820
           db_mls_range ? db_mls_range : "unknown");
22e5820
     if (ret == EOK && db_seuser && db_mls_range &&
22e5820
             strcmp(db_seuser, ibuf->seuser) == 0 &&
22e5820
             strcmp(db_mls_range, ibuf->mls_range) == 0) {
22e5820
         needs_update = false;
22e5820
     }
22e5820
+    /* OR */
22e5820
+    if (ret == ERR_SELINUX_NOT_MANAGED) {
22e5820
+        needs_update = false;
22e5820
+    }
22e5820
 
22e5820
     talloc_free(db_seuser);
22e5820
     talloc_free(db_mls_range);
22e5820
diff --git a/src/util/sss_semanage.c b/src/util/sss_semanage.c
22e5820
index fe06bee1dfec3abca3aa3cd5e85e55386ac11343..0da97aad4d8eba733b131c2749932e03ca4242c4 100644
22e5820
--- a/src/util/sss_semanage.c
22e5820
+++ b/src/util/sss_semanage.c
22e5820
@@ -73,7 +73,7 @@ static void sss_semanage_close(semanage_handle_t *handle)
22e5820
     semanage_handle_destroy(handle);
22e5820
 }
22e5820
 
22e5820
-static semanage_handle_t *sss_semanage_init(void)
22e5820
+static int sss_semanage_init(semanage_handle_t **_handle)
22e5820
 {
22e5820
     int ret;
22e5820
     semanage_handle_t *handle = NULL;
22e5820
@@ -81,7 +81,8 @@ static semanage_handle_t *sss_semanage_init(void)
22e5820
     handle = semanage_handle_create();
22e5820
     if (!handle) {
22e5820
         DEBUG(SSSDBG_CRIT_FAILURE, "Cannot create SELinux management handle\n");
22e5820
-        return NULL;
22e5820
+        ret = EIO;
22e5820
+        goto done;
22e5820
     }
22e5820
 
22e5820
     semanage_msg_set_callback(handle,
22e5820
@@ -89,28 +90,41 @@ static semanage_handle_t *sss_semanage_init(void)
22e5820
                               NULL);
22e5820
 
22e5820
     ret = semanage_is_managed(handle);
22e5820
-    if (ret != 1) {
22e5820
-        DEBUG(SSSDBG_CRIT_FAILURE, "SELinux policy not managed\n");
22e5820
-        goto fail;
22e5820
+    if (ret == 0) {
22e5820
+        DEBUG(SSSDBG_TRACE_FUNC, "SELinux policy not managed via libsemanage\n");
22e5820
+        ret = ERR_SELINUX_NOT_MANAGED;
22e5820
+        goto done;
22e5820
+    } else if (ret == -1) {
22e5820
+        DEBUG(SSSDBG_CRIT_FAILURE, "Call to semanage_is_managed failed\n");
22e5820
+        ret = EIO;
22e5820
+        goto done;
22e5820
     }
22e5820
 
22e5820
     ret = semanage_access_check(handle);
22e5820
     if (ret < SEMANAGE_CAN_READ) {
22e5820
         DEBUG(SSSDBG_CRIT_FAILURE, "Cannot read SELinux policy store\n");
22e5820
-        goto fail;
22e5820
+        ret = EACCES;
22e5820
+        goto done;
22e5820
     }
22e5820
 
22e5820
     ret = semanage_connect(handle);
22e5820
     if (ret != 0) {
22e5820
         DEBUG(SSSDBG_CRIT_FAILURE,
22e5820
               "Cannot estabilish SELinux management connection\n");
22e5820
-        goto fail;
22e5820
+        ret = EIO;
22e5820
+        goto done;
22e5820
     }
22e5820
 
22e5820
-    return handle;
22e5820
-fail:
22e5820
-    sss_semanage_close(handle);
22e5820
-    return NULL;
22e5820
+    ret = EOK;
22e5820
+
22e5820
+done:
22e5820
+    if (ret != EOK) {
22e5820
+        sss_semanage_close(handle);
22e5820
+    } else {
22e5820
+        *_handle = handle;
22e5820
+    }
22e5820
+
22e5820
+    return ret;
22e5820
 }
22e5820
 
22e5820
 static int sss_semanage_user_add(semanage_handle_t *handle,
22e5820
@@ -228,10 +242,11 @@ int set_seuser(const char *login_name, const char *seuser_name,
22e5820
         return EOK;
22e5820
     }
22e5820
 
22e5820
-    handle = sss_semanage_init();
22e5820
-    if (!handle) {
22e5820
-        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot init SELinux management\n");
22e5820
-        ret = EIO;
22e5820
+    ret = sss_semanage_init(&handle);
22e5820
+    if (ret == ERR_SELINUX_NOT_MANAGED) {
22e5820
+        goto done;
22e5820
+    } else if (ret != EOK) {
22e5820
+        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot create SELinux handle\n");
22e5820
         goto done;
22e5820
     }
22e5820
 
22e5820
@@ -295,10 +310,11 @@ int del_seuser(const char *login_name)
22e5820
     int ret;
22e5820
     int exists = 0;
22e5820
 
22e5820
-    handle = sss_semanage_init();
22e5820
-    if (!handle) {
22e5820
-        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot init SELinux management\n");
22e5820
-        ret = EIO;
22e5820
+    ret = sss_semanage_init(&handle);
22e5820
+    if (ret == ERR_SELINUX_NOT_MANAGED) {
22e5820
+        goto done;
22e5820
+    } else if (ret != EOK) {
22e5820
+        DEBUG(SSSDBG_CRIT_FAILURE, "Cannot create SELinux handle\n");
22e5820
         goto done;
22e5820
     }
22e5820
 
22e5820
@@ -377,10 +393,11 @@ int get_seuser(TALLOC_CTX *mem_ctx, const char *login_name,
22e5820
     semanage_seuser_t *sm_user = NULL;
22e5820
     semanage_seuser_key_t *sm_key = NULL;
22e5820
 
22e5820
-    sm_handle = sss_semanage_init();
22e5820
-    if (sm_handle == NULL) {
22e5820
+    ret = sss_semanage_init(&sm_handle);
22e5820
+    if (ret == ERR_SELINUX_NOT_MANAGED) {
22e5820
+        goto done;
22e5820
+    } else if (ret != EOK) {
22e5820
         DEBUG(SSSDBG_CRIT_FAILURE, "Cannot create SELinux handle\n");
22e5820
-        ret = EIO;
22e5820
         goto done;
22e5820
     }
22e5820
 
22e5820
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
22e5820
index 466a3b4062f39b29d831a5d8a62dc8d576eb2e97..97eaf160f20bcc8cfe52254070a2d182e19addd4 100644
22e5820
--- a/src/util/util_errors.c
22e5820
+++ b/src/util/util_errors.c
22e5820
@@ -75,6 +75,7 @@ struct err_string error_to_str[] = {
22e5820
     { "Cannot connect to system bus" }, /* ERR_NO_SYSBUS */
22e5820
     { "LDAP search returned a referral" }, /* ERR_REFERRAL */
22e5820
     { "Error setting SELinux user context" }, /* ERR_SELINUX_CONTEXT */
22e5820
+    { "SELinux is not managed by libsemanage" }, /* ERR_SELINUX_NOT_MANAGED */
22e5820
     { "Username format not allowed by re_expression" }, /* ERR_REGEX_NOMATCH */
22e5820
     { "Time specification not supported" }, /* ERR_TIMESPEC_NOT_SUPPORTED */
22e5820
     { "Invalid SSSD configuration detected" }, /* ERR_INVALID_CONFIG */
22e5820
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
22e5820
index 2f90c0a5d65325a431a8e4d9a480170808c9198e..4a250bf0339ba689680c155fa8e6d43f42c2467e 100644
22e5820
--- a/src/util/util_errors.h
22e5820
+++ b/src/util/util_errors.h
22e5820
@@ -97,6 +97,7 @@ enum sssd_errors {
22e5820
     ERR_NO_SYSBUS,
22e5820
     ERR_REFERRAL,
22e5820
     ERR_SELINUX_CONTEXT,
22e5820
+    ERR_SELINUX_NOT_MANAGED,
22e5820
     ERR_REGEX_NOMATCH,
22e5820
     ERR_TIMESPEC_NOT_SUPPORTED,
22e5820
     ERR_INVALID_CONFIG,
22e5820
-- 
22e5820
2.12.2
22e5820