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);
assert(atfd >= 0 || inode_path);
#if HAVE_SELINUX
- _cleanup_close_ int opened_fd = -1;
+ _cleanup_close_ int opened_fd = -EBADF;
_cleanup_free_ char *p = NULL;
int inode_fd, r;
#if HAVE_SELINUX
_cleanup_freecon_ char *mycon = NULL, *fcon = NULL;
security_class_t sclass;
- int r;
assert(exe);
assert(label);
if (!mac_selinux_use())
return -EOPNOTSUPP;
- r = getcon_raw(&mycon);
- if (r < 0)
+ if (getcon_raw(&mycon) < 0)
return -errno;
+ if (!mycon)
+ return -EOPNOTSUPP;
- r = getfilecon_raw(exe, &fcon);
- if (r < 0)
+ if (getfilecon_raw(exe, &fcon) < 0)
return -errno;
+ if (!fcon)
+ return -EOPNOTSUPP;
sclass = string_to_security_class("process");
if (sclass == 0)
#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
}
-int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **label) {
+int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **ret_label) {
#if HAVE_SELINUX
_cleanup_freecon_ char *mycon = NULL, *peercon = NULL, *fcon = NULL;
_cleanup_context_free_ context_t pcon = NULL, bcon = NULL;
+ const char *range = NULL, *bcon_str = NULL;
security_class_t sclass;
- const char *range = NULL;
- int r;
assert(socket_fd >= 0);
assert(exe);
- assert(label);
+ assert(ret_label);
if (!mac_selinux_use())
return -EOPNOTSUPP;
- r = getcon_raw(&mycon);
- if (r < 0)
+ if (getcon_raw(&mycon) < 0)
return -errno;
+ if (!mycon)
+ return -EOPNOTSUPP;
- r = getpeercon_raw(socket_fd, &peercon);
- if (r < 0)
+ 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 */
- r = getfilecon_raw(exe, &fcon);
- if (r < 0)
+ 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 (!range)
return -errno;
- r = context_range_set(bcon, range);
- if (r)
+ if (context_range_set(bcon, range) != 0)
return -errno;
- freecon(mycon);
- mycon = strdup(context_str(bcon));
- if (!mycon)
+ bcon_str = context_str(bcon);
+ if (!bcon_str)
return -ENOMEM;
sclass = string_to_security_class("process");
if (sclass == 0)
return -ENOSYS;
- return RET_NERRNO(security_compute_create_raw(mycon, fcon, sclass, label));
+ return RET_NERRNO(security_compute_create_raw(bcon_str, fcon, sclass, ret_label));
#else
return -EOPNOTSUPP;
#endif
_cleanup_freecon_ char *fcon = NULL;
const struct sockaddr_un *un;
bool context_changed = false;
+ size_t sz;
char *path;
int r;
if (un->sun_path[0] == 0)
goto skipped;
- path = strndupa_safe(un->sun_path,
- addrlen - offsetof(struct sockaddr_un, sun_path));
+ sz = addrlen - offsetof(struct sockaddr_un, sun_path);
+ if (sz > PATH_MAX)
+ goto skipped;
+ path = strndupa_safe(un->sun_path, sz);
/* Check for policy reload so 'label_hnd' is kept up-to-date by callbacks */
mac_selinux_maybe_reload();