diff --git a/src/core/selinux-access.c b/src/core/selinux-access.c index e05ebdc631..62181a6309 100644 --- a/src/core/selinux-access.c +++ b/src/core/selinux-access.c @@ -229,9 +229,7 @@ int mac_selinux_access_check_internal( } else { /* If no unit context is known, use our own */ if (getcon_raw(&fcon) < 0) { - r = -errno; - - log_warning_errno(r, "SELinux getcon_raw() failed%s (perm=%s): %m", + log_warning_errno(errno, "SELinux getcon_raw() failed%s (perm=%s): %m", enforce ? "" : ", ignoring", permission); if (!enforce) @@ -239,6 +237,12 @@ int mac_selinux_access_check_internal( return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "Failed to get current context: %m"); } + if (!fcon) { + if (!enforce) + return 0; + + return sd_bus_error_setf(error, SD_BUS_ERROR_ACCESS_DENIED, "We appear not to have any SELinux context: %m"); + } acon = fcon; tclass = "system"; diff --git a/src/shared/selinux-util.c b/src/shared/selinux-util.c index f7d8353b49..e240cdc2c3 100644 --- a/src/shared/selinux-util.c +++ b/src/shared/selinux-util.c @@ -277,7 +277,7 @@ static int selinux_fix_fd( return 0; /* If the old label is identical to the new one, suppress any kind of error */ - if (getfilecon_raw(FORMAT_PROC_FD_PATH(fd), &oldcon) >= 0 && streq(fcon, oldcon)) + if (getfilecon_raw(FORMAT_PROC_FD_PATH(fd), &oldcon) >= 0 && streq_ptr(fcon, oldcon)) return 0; return log_enforcing_errno(r, "Unable to fix SELinux security context of %s: %m", label_path); @@ -381,9 +381,13 @@ int mac_selinux_get_create_label_from_exe(const char *exe, char **label) { if (getcon_raw(&mycon) < 0) return -errno; + if (!mycon) + return -EOPNOTSUPP; if (getfilecon_raw(exe, &fcon) < 0) return -errno; + if (!fcon) + return -EOPNOTSUPP; sclass = string_to_security_class("process"); if (sclass == 0) @@ -395,14 +399,21 @@ int mac_selinux_get_create_label_from_exe(const char *exe, char **label) { #endif } -int mac_selinux_get_our_label(char **label) { -#if HAVE_SELINUX - assert(label); +int mac_selinux_get_our_label(char **ret) { + assert(ret); +#if HAVE_SELINUX if (!mac_selinux_use()) return -EOPNOTSUPP; - return RET_NERRNO(getcon_raw(label)); + _cleanup_freecon_ char *con = NULL; + if (getcon_raw(&con) < 0) + return -errno; + if (!con) + return -EOPNOTSUPP; + + *ret = TAKE_PTR(con); + return 0; #else return -EOPNOTSUPP; #endif @@ -424,13 +435,20 @@ int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char * if (getcon_raw(&mycon) < 0) return -errno; + if (!mycon) + return -EOPNOTSUPP; if (getpeercon_raw(socket_fd, &peercon) < 0) return -errno; + if (!peercon) + return -EOPNOTSUPP; - if (!exec_label) /* If there is no context set for next exec let's use context of target executable */ + if (!exec_label) { /* If there is no context set for next exec let's use context of target executable */ if (getfilecon_raw(exe, &fcon) < 0) return -errno; + if (!fcon) + return -EOPNOTSUPP; + } bcon = context_new(mycon); if (!bcon)