chiark / gitweb /
selinux: split off selinux calls into seperate file label.c
authorLennart Poettering <lennart@poettering.net>
Wed, 11 Aug 2010 20:58:34 +0000 (22:58 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 11 Aug 2010 20:58:34 +0000 (22:58 +0200)
Makefile.am
fixme
src/automount.c
src/label.c [new file with mode: 0644]
src/label.h [new file with mode: 0644]
src/main.c
src/socket-util.c
src/socket.c
src/util.c
src/util.h

index 038b72e1e14ffea91888fd7531b9af35bd71a0bd..abd07eb7ec0d4d2b645758f7e2d99945c8d19910 100644 (file)
@@ -240,6 +240,7 @@ noinst_LTLIBRARIES = \
 
 libsystemd_basic_la_SOURCES = \
         src/util.c \
+       src/label.c \
         src/hashmap.c \
         src/set.c \
         src/strv.c \
diff --git a/fixme b/fixme
index 20a95cbc45595beca917eac0512f4e6599770e11..02e80e88307fb8487f1ef805c5ba4d623b37803c 100644 (file)
--- a/fixme
+++ b/fixme
@@ -85,6 +85,8 @@
 
 * plymouth different shut down msgs
 
+* fix nscd disable
+
 External:
 
 * sysv functions should color when stdout is tty, not stdin
index 047af7759bbd3f706bf7a15a5bdb6f1498c8a9fd..f81d5a2c7f41b205e7247f6c5ef1ec9dfdcbea0b 100644 (file)
@@ -37,6 +37,7 @@
 #include "dbus-automount.h"
 #include "bus-errors.h"
 #include "special.h"
+#include "label.h"
 
 static const UnitActiveState state_translation_table[_AUTOMOUNT_STATE_MAX] = {
         [AUTOMOUNT_DEAD] = UNIT_INACTIVE,
diff --git a/src/label.c b/src/label.c
new file mode 100644 (file)
index 0000000..d18e5dc
--- /dev/null
@@ -0,0 +1,291 @@
+/*-*- Mode: C; c-basic-offset: 8 -*-*/
+
+/***
+  This file is part of systemd.
+
+  Copyright 2010 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <errno.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "label.h"
+#include "util.h"
+
+#ifdef HAVE_SELINUX
+#include <selinux/selinux.h>
+#include <selinux/label.h>
+
+static struct selabel_handle *label_hnd = NULL;
+
+static inline bool use_selinux(void) {
+        static int use_selinux_ind = -1;
+
+        if (use_selinux_ind < 0)
+                use_selinux_ind = is_selinux_enabled() > 0;
+
+        return use_selinux_ind;
+}
+
+static int label_get_file_label_from_path(
+                const char *label,
+                const char *path,
+                const char *class,
+                security_context_t *fcon) {
+
+        security_context_t dir_con = NULL;
+        security_class_t sclass;
+        int r = 0;
+
+        r = getfilecon(path, &dir_con);
+        if (r >= 0) {
+                r = -1;
+                errno = EINVAL;
+
+                if ((sclass = string_to_security_class(class)) != 0)
+                        r = security_compute_create((security_context_t) label, dir_con, sclass, fcon);
+        }
+        if (r < 0)
+                r = -errno;
+
+        freecon(dir_con);
+        return r;
+}
+
+#endif
+
+int label_init(void) {
+        int r = 0;
+
+#ifdef HAVE_SELINUX
+
+        if (!use_selinux())
+                return 0;
+
+        label_hnd = selabel_open(SELABEL_CTX_FILE, NULL, 0);
+        if (!label_hnd) {
+                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
+                         "Failed to initialize SELinux context: %m");
+                r = (security_getenforce() == 1) ? -errno : 0;
+        }
+#endif
+
+        return r;
+}
+
+int label_fix(const char *path) {
+        int r = 0;
+
+#ifdef HAVE_SELINUX
+        struct stat st;
+        security_context_t fcon;
+
+        if (!use_selinux() || !label_hnd)
+                return 0;
+
+        r = lstat(path, &st);
+        if (r == 0) {
+                r = selabel_lookup_raw(label_hnd, &fcon, path, st.st_mode);
+
+                if (r == 0) {
+                        r = setfilecon(path, fcon);
+                        freecon(fcon);
+                }
+        }
+        if (r < 0) {
+                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
+                         "Unable to fix label of %s: %m", path);
+                r = (security_getenforce() == 1) ? -errno : 0;
+        }
+#endif
+
+        return r;
+}
+
+void label_finish(void) {
+
+#ifdef HAVE_SELINUX
+        if (use_selinux() && label_hnd)
+                selabel_close(label_hnd);
+#endif
+}
+
+int label_get_socket_label_from_exe(const char *exe, char **label) {
+
+        int r = 0;
+
+#ifdef HAVE_SELINUX
+        security_context_t mycon = NULL, fcon = NULL;
+        security_class_t sclass;
+
+        if (!use_selinux()) {
+                *label = NULL;
+                return 0;
+        }
+
+        r = getcon(&mycon);
+        if (r < 0)
+                goto fail;
+
+        r = getfilecon(exe, &fcon);
+        if (r < 0)
+                goto fail;
+
+        sclass = string_to_security_class("process");
+        r = security_compute_create(mycon, fcon, sclass, (security_context_t *) label);
+        if (r == 0)
+                log_debug("SELinux Socket context for %s will be set to %s", exe, *label);
+
+fail:
+        if (r < 0 && security_getenforce() == 1)
+                r = -errno;
+
+        freecon(mycon);
+        freecon(fcon);
+#endif
+
+        return r;
+}
+
+int label_fifofile_set(const char *label, const char *path) {
+        int r = 0;
+
+#ifdef HAVE_SELINUX
+        security_context_t filecon = NULL;
+
+        if (!use_selinux() || !label)
+                return 0;
+
+        if (((r = label_get_file_label_from_path(label, path, "fifo_file", &filecon)) == 0)) {
+                if ((r = setfscreatecon(filecon)) < 0) {
+                        log_error("Failed to set SELinux file context (%s) on %s: %m", label, path);
+                        r = -errno;
+                }
+
+                freecon(filecon);
+        }
+
+        if (r < 0 && security_getenforce() == 0)
+                r = 0;
+#endif
+
+        return r;
+}
+
+int label_socket_set(const char *label) {
+
+#ifdef HAVE_SELINUX
+        if (!use_selinux())
+                return 0;
+
+        if (setsockcreatecon((security_context_t) label) < 0) {
+                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
+                         "Failed to set SELinux context (%s) on socket: %m", label);
+
+                if (security_getenforce() == 1)
+                        return -errno;
+        }
+#endif
+
+        return 0;
+}
+
+void label_file_clear(void) {
+
+#ifdef HAVE_SELINUX
+        if (!use_selinux())
+                return;
+
+        setfscreatecon(NULL);
+#endif
+}
+
+void label_socket_clear(void) {
+
+#ifdef HAVE_SELINUX
+        if (!use_selinux())
+                return;
+
+        setsockcreatecon(NULL);
+#endif
+}
+
+void label_free(const char *label) {
+
+#ifdef HAVE_SELINUX
+        if (!use_selinux())
+                return;
+
+        freecon((security_context_t) label);
+#endif
+}
+
+int label_mkdir(
+        const char *path,
+        mode_t mode) {
+
+        /* Creates a directory and labels it according to the SELinux policy */
+
+#ifdef HAVE_SELINUX
+        int r;
+        security_context_t fcon = NULL;
+
+        if (use_selinux() && label_hnd) {
+
+                if (path[0] == '/')
+                        r = selabel_lookup_raw(label_hnd, &fcon, path, mode);
+                else {
+                        char *cwd = NULL, *newpath = NULL;
+
+                        cwd = get_current_dir_name();
+
+                        if (cwd || asprintf(&newpath, "%s/%s", cwd, path) < 0) {
+                                free(cwd);
+                                return -errno;
+                        }
+
+                        r = selabel_lookup_raw(label_hnd, &fcon, newpath, mode);
+                        free(cwd);
+                        free(newpath);
+                }
+
+                if (r == 0)
+                        r = setfscreatecon(fcon);
+
+                if (r < 0 && errno != ENOENT) {
+                        log_error("Failed to set security context %s for %s: %m", fcon, path);
+                        r = -errno;
+
+                        if (security_getenforce() == 1)
+                                goto finish;
+                }
+        }
+
+        if ((r = mkdir(path, mode)) < 0)
+                r = -errno;
+
+finish:
+        if (use_selinux() && label_hnd) {
+                setfscreatecon(NULL);
+                freecon(fcon);
+        }
+
+        return r;
+#else
+        return mkdir(path, mode);
+#endif
+}
diff --git a/src/label.h b/src/label.h
new file mode 100644 (file)
index 0000000..5a3c9d1
--- /dev/null
@@ -0,0 +1,44 @@
+/*-*- Mode: C; c-basic-offset: 8 -*-*/
+
+#ifndef foolabelhfoo
+#define foolabelhfoo
+
+/***
+  This file is part of systemd.
+
+  Copyright 2010 Lennart Poettering
+
+  systemd is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  systemd is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <sys/types.h>
+
+int label_init(void);
+void label_finish(void);
+
+int label_fix(const char *path);
+
+int label_socket_set(const char *label);
+void label_socket_clear(void);
+
+int label_fifofile_set(const char *label, const char *path);
+void label_file_clear(void);
+
+void label_free(const char *label);
+
+int label_get_socket_label_from_exe(const char *exe, char **label);
+
+int label_mkdir(const char *path, mode_t mode);
+
+#endif
index 3810033fb223ca5bf1586d71cd2894a35eb82528..72015bc544f3766519a8b041ff7112d58e62a317 100644 (file)
@@ -45,6 +45,7 @@
 #include "conf-parser.h"
 #include "bus-errors.h"
 #include "missing.h"
+#include "label.h"
 
 static enum {
         ACTION_RUN,
index 2af85639657916fe903d998101575ff1d0c740e8..ea2171b5bfff24cf91ebd1d77c8a470d905c682b 100644 (file)
@@ -34,6 +34,7 @@
 #include "util.h"
 #include "socket-util.h"
 #include "missing.h"
+#include "label.h"
 
 int socket_address_parse(SocketAddress *a, const char *s) {
         int r;
index 5132f8e7002abf34395bfeca0468293e793bc13b..d76a81ff993b8aaeddc22a539c13176d6fac6733 100644 (file)
@@ -40,6 +40,7 @@
 #include "missing.h"
 #include "special.h"
 #include "bus-errors.h"
+#include "label.h"
 
 static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
         [SOCKET_DEAD] = UNIT_INACTIVE,
index a2def28730c935f0f3bc684ac37b5ebe8410d11e..4e371d148e34759697fca5a3fbdaa45dcf5f9372 100644 (file)
 #include "missing.h"
 #include "log.h"
 #include "strv.h"
-
-#ifdef HAVE_SELINUX
-#include <selinux/selinux.h>
-#include <selinux/label.h>
-
-static struct selabel_handle *label_hnd = NULL;
-
-static inline bool use_selinux(void) {
-        static int use_selinux_ind = -1;
-
-        if (use_selinux_ind < 0)
-                use_selinux_ind = is_selinux_enabled() > 0;
-
-        return use_selinux_ind;
-}
-
-static int label_get_file_label_from_path(
-                const char *label,
-                const char *path,
-                const char *class,
-                security_context_t *fcon) {
-
-        security_context_t dir_con = NULL;
-        security_class_t sclass;
-        int r = 0;
-
-        r = getfilecon(path, &dir_con);
-        if (r >= 0) {
-                r = -1;
-                errno = EINVAL;
-
-                if ((sclass = string_to_security_class(class)) != 0)
-                        r = security_compute_create((security_context_t) label, dir_con, sclass, fcon);
-        }
-        if (r < 0)
-                r = -errno;
-
-        freecon(dir_con);
-        return r;
-}
-
-#endif
-
-int label_init(void) {
-        int r = 0;
-
-#ifdef HAVE_SELINUX
-
-        if (!use_selinux())
-                return 0;
-
-        label_hnd = selabel_open(SELABEL_CTX_FILE, NULL, 0);
-        if (!label_hnd) {
-                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
-                         "Failed to initialize SELinux context: %m");
-                r = (security_getenforce() == 1) ? -errno : 0;
-        }
-#endif
-
-        return r;
-}
-
-int label_fix(const char *path) {
-        int r = 0;
-
-#ifdef HAVE_SELINUX
-        struct stat st;
-        security_context_t fcon;
-
-        if (!use_selinux() || !label_hnd)
-                return 0;
-
-        r = lstat(path, &st);
-        if (r == 0) {
-                r = selabel_lookup_raw(label_hnd, &fcon, path, st.st_mode);
-
-                if (r == 0) {
-                        r = setfilecon(path, fcon);
-                        freecon(fcon);
-                }
-        }
-        if (r < 0) {
-                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
-                         "Unable to fix label of %s: %m", path);
-                r = (security_getenforce() == 1) ? -errno : 0;
-        }
-#endif
-
-        return r;
-}
-
-void label_finish(void) {
-
-#ifdef HAVE_SELINUX
-        if (use_selinux() && label_hnd)
-                selabel_close(label_hnd);
-#endif
-}
-
-int label_get_socket_label_from_exe(const char *exe, char **label) {
-
-        int r = 0;
-
-#ifdef HAVE_SELINUX
-        security_context_t mycon = NULL, fcon = NULL;
-        security_class_t sclass;
-
-        if (!use_selinux()) {
-                *label = NULL;
-                return 0;
-        }
-
-        r = getcon(&mycon);
-        if (r < 0)
-                goto fail;
-
-        r = getfilecon(exe, &fcon);
-        if (r < 0)
-                goto fail;
-
-        sclass = string_to_security_class("process");
-        r = security_compute_create(mycon, fcon, sclass, (security_context_t *) label);
-        if (r == 0)
-                log_debug("SELinux Socket context for %s will be set to %s", exe, *label);
-
-fail:
-        if (r < 0 && security_getenforce() == 1)
-                r = -errno;
-
-        freecon(mycon);
-        freecon(fcon);
-#endif
-
-        return r;
-}
-
-int label_fifofile_set(const char *label, const char *path) {
-        int r = 0;
-
-#ifdef HAVE_SELINUX
-        security_context_t filecon = NULL;
-
-        if (!use_selinux() || !label)
-                return 0;
-
-        if (((r = label_get_file_label_from_path(label, path, "fifo_file", &filecon)) == 0)) {
-                if ((r = setfscreatecon(filecon)) < 0) {
-                        log_error("Failed to set SELinux file context (%s) on %s: %m", label, path);
-                        r = -errno;
-                }
-
-                freecon(filecon);
-        }
-
-        if (r < 0 && security_getenforce() == 0)
-                r = 0;
-#endif
-
-        return r;
-}
-
-int label_socket_set(const char *label) {
-
-#ifdef HAVE_SELINUX
-        if (!use_selinux())
-                return 0;
-
-        if (setsockcreatecon((security_context_t) label) < 0) {
-                log_full(security_getenforce() == 1 ? LOG_ERR : LOG_DEBUG,
-                         "Failed to set SELinux context (%s) on socket: %m", label);
-
-                if (security_getenforce() == 1)
-                        return -errno;
-        }
-#endif
-
-        return 0;
-}
-
-void label_file_clear(void) {
-
-#ifdef HAVE_SELINUX
-        if (!use_selinux())
-                return;
-
-        setfscreatecon(NULL);
-#endif
-}
-
-void label_socket_clear(void) {
-
-#ifdef HAVE_SELINUX
-        if (!use_selinux())
-                return;
-
-        setsockcreatecon(NULL);
-#endif
-}
-
-void label_free(const char *label) {
-
-#ifdef HAVE_SELINUX
-        if (!use_selinux())
-                return;
-
-        freecon((security_context_t) label);
-#endif
-}
-
-static int label_mkdir(
-        const char *path,
-        mode_t mode) {
-
-#ifdef HAVE_SELINUX
-        int r;
-        security_context_t fcon = NULL;
-
-        if (use_selinux() && label_hnd) {
-                if (path[0] == '/') {
-                        r = selabel_lookup_raw(label_hnd, &fcon, path, mode);
-                }
-                else {
-                        char *cwd = NULL;
-                        char *newpath = NULL;
-                        cwd = getcwd(NULL,0);
-                        if ((! cwd) || (asprintf(&newpath, "%s/%s",cwd,path) < 0)) {
-                                free(cwd);
-                                return -errno;
-                        }
-                        r = selabel_lookup_raw(label_hnd, &fcon, newpath, mode);
-                        free(cwd);
-                        free(newpath);
-                }
-
-                if (r == 0)
-                        r = setfscreatecon(fcon);
-
-                if ((r < 0) && (errno != ENOENT)) {
-                        log_error("Failed to set security context %s for %s", fcon, path);
-
-                        if (security_getenforce() == 1)
-                                goto finish;
-                }
-        }
-        r = mkdir(path, mode);
-
-finish:
-        if (use_selinux() && label_hnd) {
-                setfscreatecon(NULL);
-                freecon(fcon);
-        }
-
-        return r;
-#else
-        return mkdir(path, mode);
-#endif
-}
+#include "label.h"
 
 bool streq_ptr(const char *a, const char *b) {
 
index d08c7b0e7ad5000e8f56e7c953c28786dff07cd7..b2a2925604dcac3cdaf355d98065da9870a788eb 100644 (file)
@@ -361,14 +361,4 @@ int ip_tos_from_string(const char *s);
 const char *signal_to_string(int i);
 int signal_from_string(const char *s);
 
-int label_init(void);
-int label_fix(const char *path);
-void label_finish(void);
-int label_socket_set(const char *label);
-void label_socket_clear(void);
-int label_fifofile_set(const char *label, const char *path);
-void label_file_clear(void);
-void label_free(const char *label);
-int label_get_socket_label_from_exe(const char *exe, char **label);
-
 #endif