• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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