1 #include <unistd.h>
2 #include <sys/types.h>
3 #include <fcntl.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <errno.h>
7 #include <string.h>
8 #include "selinux_internal.h"
9 #include "policy.h"
10 #include <limits.h>
11
12 #define SELINUX_INITCON_DIR "/initial_contexts/"
13
security_get_initial_context_raw(const char * name,char ** con)14 int security_get_initial_context_raw(const char * name, char ** con)
15 {
16 char path[PATH_MAX];
17 char *buf;
18 size_t size;
19 int fd, ret;
20
21 if (!selinux_mnt) {
22 errno = ENOENT;
23 return -1;
24 }
25
26 if (strchr(name, '/')) {
27 errno = EINVAL;
28 return -1;
29 }
30
31 ret = snprintf(path, sizeof path, "%s%s%s", selinux_mnt, SELINUX_INITCON_DIR, name);
32 if (ret < 0 || (size_t)ret >= sizeof path) {
33 errno = EOVERFLOW;
34 return -1;
35 }
36
37 fd = open(path, O_RDONLY | O_CLOEXEC);
38 if (fd < 0)
39 return -1;
40
41 size = selinux_page_size;
42 buf = malloc(size);
43 if (!buf) {
44 ret = -1;
45 goto out;
46 }
47 memset(buf, 0, size);
48 ret = read(fd, buf, size - 1);
49 if (ret < 0)
50 goto out2;
51
52 *con = strdup(buf);
53 if (!(*con)) {
54 ret = -1;
55 goto out2;
56 }
57 ret = 0;
58 out2:
59 free(buf);
60 out:
61 close(fd);
62 return ret;
63 }
64
65
security_get_initial_context(const char * name,char ** con)66 int security_get_initial_context(const char * name, char ** con)
67 {
68 int ret;
69 char * rcon;
70
71 ret = security_get_initial_context_raw(name, &rcon);
72 if (!ret) {
73 ret = selinux_raw_to_trans_context(rcon, con);
74 freecon(rcon);
75 }
76
77 return ret;
78 }
79
80