#include #include #include #include #include #include #include #include #include "selinux_internal.h" #include "policy.h" #include int security_compute_user_raw(security_context_t scon, const char *user, security_context_t **con) { char path[PATH_MAX]; char **ary; char *buf, *ptr; size_t size; int fd, ret; unsigned int i, nel; snprintf(path, sizeof path, "%s/user", selinux_mnt); fd = open(path, O_RDWR); if (fd < 0) return -1; size = PAGE_SIZE; buf = malloc(size); if (!buf) { ret = -1; goto out; } snprintf(buf, size, "%s %s", scon, user); ret = write(fd, buf, strlen(buf)); if (ret < 0) goto out2; memset(buf, 0, size); ret = read(fd, buf, size-1); if (ret < 0) goto out2; if (sscanf(buf, "%u", &nel) != 1) { ret = -1; goto out2; } ary = malloc((nel+1)*sizeof(char*)); if (!ary) { ret = -1; goto out2; } ptr = buf + strlen(buf) + 1; for (i = 0; i < nel; i++) { ary[i] = strdup(ptr); if (!ary[i]) { freeconary(ary); ret = -1; goto out2; } ptr += strlen(ptr) + 1; } ary[nel] = NULL; *con = ary; ret = 0; out2: free(buf); out: close(fd); return ret; } hidden_def(security_compute_user_raw) int security_compute_user(security_context_t scon, const char *user, security_context_t **con) { int ret; security_context_t rscon = scon; if (context_translations && trans_to_raw_context(scon, &rscon)) return -1; ret = security_compute_user_raw(rscon, user, con); if (context_translations) { freecon(rscon); if (!ret) { security_context_t *ptr, tmpcon; for (ptr = *con; *ptr; ptr++) { if (raw_to_trans_context(*ptr, &tmpcon)) { freeconary(*con); *con = NULL; return -1; } freecon(*ptr); *ptr = tmpcon; } } } return ret; } hidden_def(security_compute_user)