1255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdio.h>
2b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley
3255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdlib.h>
4255e72915d4cbddceb435e13d81601755714e9fSE Android#include <ctype.h>
5255e72915d4cbddceb435e13d81601755714e9fSE Android#include <errno.h>
6255e72915d4cbddceb435e13d81601755714e9fSE Android#include <limits.h>
7255e72915d4cbddceb435e13d81601755714e9fSE Android
8255e72915d4cbddceb435e13d81601755714e9fSE Android#include <sepol/policydb/policydb.h>
9b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley
10b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#ifndef DARWIN
11b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#include <stdio_ext.h>
12b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#endif
13b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley
14255e72915d4cbddceb435e13d81601755714e9fSE Android#include <stdarg.h>
15255e72915d4cbddceb435e13d81601755714e9fSE Android
16255e72915d4cbddceb435e13d81601755714e9fSE Android#include "debug.h"
17255e72915d4cbddceb435e13d81601755714e9fSE Android#include "private.h"
18255e72915d4cbddceb435e13d81601755714e9fSE Android#include "dso.h"
19255e72915d4cbddceb435e13d81601755714e9fSE Android#include "mls.h"
20255e72915d4cbddceb435e13d81601755714e9fSE Android
21255e72915d4cbddceb435e13d81601755714e9fSE Android/* -- Deprecated -- */
22255e72915d4cbddceb435e13d81601755714e9fSE Android
23255e72915d4cbddceb435e13d81601755714e9fSE Androidvoid sepol_set_delusers(int on __attribute((unused)))
24255e72915d4cbddceb435e13d81601755714e9fSE Android{
25255e72915d4cbddceb435e13d81601755714e9fSE Android	WARN(NULL, "Deprecated interface");
26255e72915d4cbddceb435e13d81601755714e9fSE Android}
27255e72915d4cbddceb435e13d81601755714e9fSE Android
28255e72915d4cbddceb435e13d81601755714e9fSE Android#undef BADLINE
29255e72915d4cbddceb435e13d81601755714e9fSE Android#define BADLINE() { \
30255e72915d4cbddceb435e13d81601755714e9fSE Android	ERR(NULL, "invalid entry %s (%s:%u)", \
31255e72915d4cbddceb435e13d81601755714e9fSE Android		buffer, path, lineno); \
32255e72915d4cbddceb435e13d81601755714e9fSE Android	continue; \
33255e72915d4cbddceb435e13d81601755714e9fSE Android}
34255e72915d4cbddceb435e13d81601755714e9fSE Android
35255e72915d4cbddceb435e13d81601755714e9fSE Androidstatic int load_users(struct policydb *policydb, const char *path)
36255e72915d4cbddceb435e13d81601755714e9fSE Android{
37255e72915d4cbddceb435e13d81601755714e9fSE Android	FILE *fp;
38255e72915d4cbddceb435e13d81601755714e9fSE Android	char *buffer = NULL, *p, *q, oldc;
39255e72915d4cbddceb435e13d81601755714e9fSE Android	size_t len = 0;
40255e72915d4cbddceb435e13d81601755714e9fSE Android	ssize_t nread;
41255e72915d4cbddceb435e13d81601755714e9fSE Android	unsigned lineno = 0, islist = 0, bit;
42255e72915d4cbddceb435e13d81601755714e9fSE Android	user_datum_t *usrdatum;
43255e72915d4cbddceb435e13d81601755714e9fSE Android	role_datum_t *roldatum;
44255e72915d4cbddceb435e13d81601755714e9fSE Android	ebitmap_node_t *rnode;
45255e72915d4cbddceb435e13d81601755714e9fSE Android
46255e72915d4cbddceb435e13d81601755714e9fSE Android	fp = fopen(path, "r");
47255e72915d4cbddceb435e13d81601755714e9fSE Android	if (fp == NULL)
48255e72915d4cbddceb435e13d81601755714e9fSE Android		return -1;
49255e72915d4cbddceb435e13d81601755714e9fSE Android
50b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#ifdef DARWIN
51b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	if ((buffer = (char *)malloc(255 * sizeof(char))) == NULL) {
52b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	  ERR(NULL, "out of memory");
53b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	  return -1;
54b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	}
55b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley
56b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	while(fgets(buffer, 255, fp) != NULL) {
57b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#else
58b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley	__fsetlocking(fp, FSETLOCKING_BYCALLER);
59255e72915d4cbddceb435e13d81601755714e9fSE Android	while ((nread = getline(&buffer, &len, fp)) > 0) {
60b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley#endif
61b1db49d77789525ac1f4e73e978e35694f21ea1aStephen Smalley
62255e72915d4cbddceb435e13d81601755714e9fSE Android		lineno++;
63255e72915d4cbddceb435e13d81601755714e9fSE Android		if (buffer[nread - 1] == '\n')
64255e72915d4cbddceb435e13d81601755714e9fSE Android			buffer[nread - 1] = 0;
65255e72915d4cbddceb435e13d81601755714e9fSE Android		p = buffer;
66255e72915d4cbddceb435e13d81601755714e9fSE Android		while (*p && isspace(*p))
67255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
68255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!(*p) || *p == '#')
69255e72915d4cbddceb435e13d81601755714e9fSE Android			continue;
70255e72915d4cbddceb435e13d81601755714e9fSE Android
71255e72915d4cbddceb435e13d81601755714e9fSE Android		if (strncasecmp(p, "user", 4))
72255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
73255e72915d4cbddceb435e13d81601755714e9fSE Android		p += 4;
74255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!isspace(*p))
75255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
76255e72915d4cbddceb435e13d81601755714e9fSE Android		while (*p && isspace(*p))
77255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
78255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!(*p))
79255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
80255e72915d4cbddceb435e13d81601755714e9fSE Android		q = p;
81255e72915d4cbddceb435e13d81601755714e9fSE Android		while (*p && !isspace(*p))
82255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
83255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!(*p))
84255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
85255e72915d4cbddceb435e13d81601755714e9fSE Android		*p++ = 0;
86255e72915d4cbddceb435e13d81601755714e9fSE Android
87255e72915d4cbddceb435e13d81601755714e9fSE Android		usrdatum = hashtab_search(policydb->p_users.table, q);
88255e72915d4cbddceb435e13d81601755714e9fSE Android		if (usrdatum) {
89255e72915d4cbddceb435e13d81601755714e9fSE Android			/* Replacing an existing user definition. */
90255e72915d4cbddceb435e13d81601755714e9fSE Android			ebitmap_destroy(&usrdatum->roles.roles);
91255e72915d4cbddceb435e13d81601755714e9fSE Android			ebitmap_init(&usrdatum->roles.roles);
92255e72915d4cbddceb435e13d81601755714e9fSE Android		} else {
93255e72915d4cbddceb435e13d81601755714e9fSE Android			char *id = strdup(q);
948fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley
95b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu			if (!id) {
96b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				ERR(NULL, "out of memory");
97b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				free(buffer);
98b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				fclose(fp);
99b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				return -1;
100b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu			}
101255e72915d4cbddceb435e13d81601755714e9fSE Android
102255e72915d4cbddceb435e13d81601755714e9fSE Android			/* Adding a new user definition. */
1038fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley			usrdatum = malloc(sizeof(user_datum_t));
104b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu			if (!usrdatum) {
105255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "out of memory");
106255e72915d4cbddceb435e13d81601755714e9fSE Android				free(buffer);
107b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				free(id);
108255e72915d4cbddceb435e13d81601755714e9fSE Android				fclose(fp);
109255e72915d4cbddceb435e13d81601755714e9fSE Android				return -1;
110255e72915d4cbddceb435e13d81601755714e9fSE Android			}
1118fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley
1128fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley			user_datum_init(usrdatum);
113255e72915d4cbddceb435e13d81601755714e9fSE Android			usrdatum->s.value = ++policydb->p_users.nprim;
114255e72915d4cbddceb435e13d81601755714e9fSE Android			if (hashtab_insert(policydb->p_users.table,
115255e72915d4cbddceb435e13d81601755714e9fSE Android					   id, (hashtab_datum_t) usrdatum)) {
116255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "out of memory");
117255e72915d4cbddceb435e13d81601755714e9fSE Android				free(buffer);
118b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				free(id);
1198fd7c65a336d45d5225f32363a9f26c1e3e60c3cStephen Smalley				user_datum_destroy(usrdatum);
120b0e0162a246f2c051427154909c0ecd694cc4805Alice Chu				free(usrdatum);
121255e72915d4cbddceb435e13d81601755714e9fSE Android				fclose(fp);
122255e72915d4cbddceb435e13d81601755714e9fSE Android				return -1;
123255e72915d4cbddceb435e13d81601755714e9fSE Android			}
124255e72915d4cbddceb435e13d81601755714e9fSE Android		}
125255e72915d4cbddceb435e13d81601755714e9fSE Android
126255e72915d4cbddceb435e13d81601755714e9fSE Android		while (*p && isspace(*p))
127255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
128255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!(*p))
129255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
130255e72915d4cbddceb435e13d81601755714e9fSE Android		if (strncasecmp(p, "roles", 5))
131255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
132255e72915d4cbddceb435e13d81601755714e9fSE Android		p += 5;
133255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!isspace(*p))
134255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
135255e72915d4cbddceb435e13d81601755714e9fSE Android		while (*p && isspace(*p))
136255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
137255e72915d4cbddceb435e13d81601755714e9fSE Android		if (!(*p))
138255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
139255e72915d4cbddceb435e13d81601755714e9fSE Android		if (*p == '{') {
140255e72915d4cbddceb435e13d81601755714e9fSE Android			islist = 1;
141255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
142255e72915d4cbddceb435e13d81601755714e9fSE Android		} else
143255e72915d4cbddceb435e13d81601755714e9fSE Android			islist = 0;
144255e72915d4cbddceb435e13d81601755714e9fSE Android
145255e72915d4cbddceb435e13d81601755714e9fSE Android		oldc = 0;
146255e72915d4cbddceb435e13d81601755714e9fSE Android		do {
147255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && isspace(*p))
148255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
149255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
150255e72915d4cbddceb435e13d81601755714e9fSE Android				break;
151255e72915d4cbddceb435e13d81601755714e9fSE Android
152255e72915d4cbddceb435e13d81601755714e9fSE Android			q = p;
153255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && *p != ';' && *p != '}' && !isspace(*p))
154255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
155255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
156255e72915d4cbddceb435e13d81601755714e9fSE Android				break;
157255e72915d4cbddceb435e13d81601755714e9fSE Android			if (*p == '}')
158255e72915d4cbddceb435e13d81601755714e9fSE Android				islist = 0;
159255e72915d4cbddceb435e13d81601755714e9fSE Android			oldc = *p;
160255e72915d4cbddceb435e13d81601755714e9fSE Android			*p++ = 0;
161255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!q[0])
162255e72915d4cbddceb435e13d81601755714e9fSE Android				break;
163255e72915d4cbddceb435e13d81601755714e9fSE Android
164255e72915d4cbddceb435e13d81601755714e9fSE Android			roldatum = hashtab_search(policydb->p_roles.table, q);
165255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!roldatum) {
166255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "undefined role %s (%s:%u)",
167255e72915d4cbddceb435e13d81601755714e9fSE Android				    q, path, lineno);
168255e72915d4cbddceb435e13d81601755714e9fSE Android				continue;
169255e72915d4cbddceb435e13d81601755714e9fSE Android			}
170255e72915d4cbddceb435e13d81601755714e9fSE Android			/* Set the role and every role it dominates */
171255e72915d4cbddceb435e13d81601755714e9fSE Android			ebitmap_for_each_bit(&roldatum->dominates, rnode, bit) {
172255e72915d4cbddceb435e13d81601755714e9fSE Android				if (ebitmap_node_get_bit(rnode, bit))
173255e72915d4cbddceb435e13d81601755714e9fSE Android					if (ebitmap_set_bit
174255e72915d4cbddceb435e13d81601755714e9fSE Android					    (&usrdatum->roles.roles, bit, 1)) {
175255e72915d4cbddceb435e13d81601755714e9fSE Android						ERR(NULL, "out of memory");
176255e72915d4cbddceb435e13d81601755714e9fSE Android						free(buffer);
177255e72915d4cbddceb435e13d81601755714e9fSE Android						fclose(fp);
178255e72915d4cbddceb435e13d81601755714e9fSE Android						return -1;
179255e72915d4cbddceb435e13d81601755714e9fSE Android					}
180255e72915d4cbddceb435e13d81601755714e9fSE Android			}
181255e72915d4cbddceb435e13d81601755714e9fSE Android		} while (islist);
182255e72915d4cbddceb435e13d81601755714e9fSE Android		if (oldc == 0)
183255e72915d4cbddceb435e13d81601755714e9fSE Android			BADLINE();
184255e72915d4cbddceb435e13d81601755714e9fSE Android
185255e72915d4cbddceb435e13d81601755714e9fSE Android		if (policydb->mls) {
186255e72915d4cbddceb435e13d81601755714e9fSE Android			context_struct_t context;
187255e72915d4cbddceb435e13d81601755714e9fSE Android			char *scontext, *r, *s;
188255e72915d4cbddceb435e13d81601755714e9fSE Android
189255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && isspace(*p))
190255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
191255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
192255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
193255e72915d4cbddceb435e13d81601755714e9fSE Android			if (strncasecmp(p, "level", 5))
194255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
195255e72915d4cbddceb435e13d81601755714e9fSE Android			p += 5;
196255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!isspace(*p))
197255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
198255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && isspace(*p))
199255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
200255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
201255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
202255e72915d4cbddceb435e13d81601755714e9fSE Android			q = p;
203255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && strncasecmp(p, "range", 5))
204255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
205255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
206255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
207255e72915d4cbddceb435e13d81601755714e9fSE Android			*--p = 0;
208255e72915d4cbddceb435e13d81601755714e9fSE Android			p++;
209255e72915d4cbddceb435e13d81601755714e9fSE Android
210255e72915d4cbddceb435e13d81601755714e9fSE Android			scontext = malloc(p - q);
211255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!scontext) {
212255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "out of memory");
213255e72915d4cbddceb435e13d81601755714e9fSE Android				free(buffer);
214255e72915d4cbddceb435e13d81601755714e9fSE Android				fclose(fp);
215255e72915d4cbddceb435e13d81601755714e9fSE Android				return -1;
216255e72915d4cbddceb435e13d81601755714e9fSE Android			}
217255e72915d4cbddceb435e13d81601755714e9fSE Android			r = scontext;
218255e72915d4cbddceb435e13d81601755714e9fSE Android			s = q;
219255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*s) {
220255e72915d4cbddceb435e13d81601755714e9fSE Android				if (!isspace(*s))
221255e72915d4cbddceb435e13d81601755714e9fSE Android					*r++ = *s;
222255e72915d4cbddceb435e13d81601755714e9fSE Android				s++;
223255e72915d4cbddceb435e13d81601755714e9fSE Android			}
224255e72915d4cbddceb435e13d81601755714e9fSE Android			*r = 0;
225255e72915d4cbddceb435e13d81601755714e9fSE Android			r = scontext;
226255e72915d4cbddceb435e13d81601755714e9fSE Android
227255e72915d4cbddceb435e13d81601755714e9fSE Android			context_init(&context);
228255e72915d4cbddceb435e13d81601755714e9fSE Android			if (mls_context_to_sid(policydb, oldc, &r, &context) <
229255e72915d4cbddceb435e13d81601755714e9fSE Android			    0) {
230255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "invalid level %s (%s:%u)", scontext,
231255e72915d4cbddceb435e13d81601755714e9fSE Android				    path, lineno);
232255e72915d4cbddceb435e13d81601755714e9fSE Android				free(scontext);
233255e72915d4cbddceb435e13d81601755714e9fSE Android				continue;
234255e72915d4cbddceb435e13d81601755714e9fSE Android
235255e72915d4cbddceb435e13d81601755714e9fSE Android			}
236255e72915d4cbddceb435e13d81601755714e9fSE Android			free(scontext);
237255e72915d4cbddceb435e13d81601755714e9fSE Android			memcpy(&usrdatum->dfltlevel, &context.range.level[0],
238255e72915d4cbddceb435e13d81601755714e9fSE Android			       sizeof(usrdatum->dfltlevel));
239255e72915d4cbddceb435e13d81601755714e9fSE Android
240255e72915d4cbddceb435e13d81601755714e9fSE Android			if (strncasecmp(p, "range", 5))
241255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
242255e72915d4cbddceb435e13d81601755714e9fSE Android			p += 5;
243255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!isspace(*p))
244255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
245255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && isspace(*p))
246255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
247255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
248255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
249255e72915d4cbddceb435e13d81601755714e9fSE Android			q = p;
250255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*p && *p != ';')
251255e72915d4cbddceb435e13d81601755714e9fSE Android				p++;
252255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!(*p))
253255e72915d4cbddceb435e13d81601755714e9fSE Android				BADLINE();
254255e72915d4cbddceb435e13d81601755714e9fSE Android			*p++ = 0;
255255e72915d4cbddceb435e13d81601755714e9fSE Android
256255e72915d4cbddceb435e13d81601755714e9fSE Android			scontext = malloc(p - q);
257255e72915d4cbddceb435e13d81601755714e9fSE Android			if (!scontext) {
258255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "out of memory");
259255e72915d4cbddceb435e13d81601755714e9fSE Android				free(buffer);
260255e72915d4cbddceb435e13d81601755714e9fSE Android				fclose(fp);
261255e72915d4cbddceb435e13d81601755714e9fSE Android				return -1;
262255e72915d4cbddceb435e13d81601755714e9fSE Android			}
263255e72915d4cbddceb435e13d81601755714e9fSE Android			r = scontext;
264255e72915d4cbddceb435e13d81601755714e9fSE Android			s = q;
265255e72915d4cbddceb435e13d81601755714e9fSE Android			while (*s) {
266255e72915d4cbddceb435e13d81601755714e9fSE Android				if (!isspace(*s))
267255e72915d4cbddceb435e13d81601755714e9fSE Android					*r++ = *s;
268255e72915d4cbddceb435e13d81601755714e9fSE Android				s++;
269255e72915d4cbddceb435e13d81601755714e9fSE Android			}
270255e72915d4cbddceb435e13d81601755714e9fSE Android			*r = 0;
271255e72915d4cbddceb435e13d81601755714e9fSE Android			r = scontext;
272255e72915d4cbddceb435e13d81601755714e9fSE Android
273255e72915d4cbddceb435e13d81601755714e9fSE Android			context_init(&context);
274255e72915d4cbddceb435e13d81601755714e9fSE Android			if (mls_context_to_sid(policydb, oldc, &r, &context) <
275255e72915d4cbddceb435e13d81601755714e9fSE Android			    0) {
276255e72915d4cbddceb435e13d81601755714e9fSE Android				ERR(NULL, "invalid range %s (%s:%u)", scontext,
277255e72915d4cbddceb435e13d81601755714e9fSE Android				    path, lineno);
278255e72915d4cbddceb435e13d81601755714e9fSE Android				free(scontext);
279255e72915d4cbddceb435e13d81601755714e9fSE Android				continue;
280255e72915d4cbddceb435e13d81601755714e9fSE Android			}
281255e72915d4cbddceb435e13d81601755714e9fSE Android			free(scontext);
282255e72915d4cbddceb435e13d81601755714e9fSE Android			memcpy(&usrdatum->range, &context.range,
283255e72915d4cbddceb435e13d81601755714e9fSE Android			       sizeof(usrdatum->range));
284255e72915d4cbddceb435e13d81601755714e9fSE Android		}
285255e72915d4cbddceb435e13d81601755714e9fSE Android	}
286255e72915d4cbddceb435e13d81601755714e9fSE Android
287255e72915d4cbddceb435e13d81601755714e9fSE Android	free(buffer);
288255e72915d4cbddceb435e13d81601755714e9fSE Android	fclose(fp);
289255e72915d4cbddceb435e13d81601755714e9fSE Android	return 0;
290255e72915d4cbddceb435e13d81601755714e9fSE Android}
291255e72915d4cbddceb435e13d81601755714e9fSE Android
292255e72915d4cbddceb435e13d81601755714e9fSE Androidint sepol_genusers(void *data, size_t len,
293255e72915d4cbddceb435e13d81601755714e9fSE Android		   const char *usersdir, void **newdata, size_t * newlen)
294255e72915d4cbddceb435e13d81601755714e9fSE Android{
295255e72915d4cbddceb435e13d81601755714e9fSE Android	struct policydb policydb;
296255e72915d4cbddceb435e13d81601755714e9fSE Android	char path[PATH_MAX];
297255e72915d4cbddceb435e13d81601755714e9fSE Android
298255e72915d4cbddceb435e13d81601755714e9fSE Android	/* Construct policy database */
299255e72915d4cbddceb435e13d81601755714e9fSE Android	if (policydb_init(&policydb))
300255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err;
301255e72915d4cbddceb435e13d81601755714e9fSE Android	if (policydb_from_image(NULL, data, len, &policydb) < 0)
302255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err;
303255e72915d4cbddceb435e13d81601755714e9fSE Android
304255e72915d4cbddceb435e13d81601755714e9fSE Android	/* Load locally defined users. */
305255e72915d4cbddceb435e13d81601755714e9fSE Android	snprintf(path, sizeof path, "%s/local.users", usersdir);
306255e72915d4cbddceb435e13d81601755714e9fSE Android	if (load_users(&policydb, path) < 0)
307255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err_destroy;
308255e72915d4cbddceb435e13d81601755714e9fSE Android
309255e72915d4cbddceb435e13d81601755714e9fSE Android	/* Write policy database */
310255e72915d4cbddceb435e13d81601755714e9fSE Android	if (policydb_to_image(NULL, &policydb, newdata, newlen) < 0)
311255e72915d4cbddceb435e13d81601755714e9fSE Android		goto err_destroy;
312255e72915d4cbddceb435e13d81601755714e9fSE Android
313255e72915d4cbddceb435e13d81601755714e9fSE Android	policydb_destroy(&policydb);
314255e72915d4cbddceb435e13d81601755714e9fSE Android	return 0;
315255e72915d4cbddceb435e13d81601755714e9fSE Android
316255e72915d4cbddceb435e13d81601755714e9fSE Android      err_destroy:
317255e72915d4cbddceb435e13d81601755714e9fSE Android	policydb_destroy(&policydb);
318255e72915d4cbddceb435e13d81601755714e9fSE Android
319255e72915d4cbddceb435e13d81601755714e9fSE Android      err:
320255e72915d4cbddceb435e13d81601755714e9fSE Android	return -1;
321255e72915d4cbddceb435e13d81601755714e9fSE Android}
322255e72915d4cbddceb435e13d81601755714e9fSE Android
323255e72915d4cbddceb435e13d81601755714e9fSE Androidint hidden sepol_genusers_policydb(policydb_t * policydb, const char *usersdir)
324255e72915d4cbddceb435e13d81601755714e9fSE Android{
325255e72915d4cbddceb435e13d81601755714e9fSE Android	char path[PATH_MAX];
326255e72915d4cbddceb435e13d81601755714e9fSE Android
327255e72915d4cbddceb435e13d81601755714e9fSE Android	/* Load locally defined users. */
328255e72915d4cbddceb435e13d81601755714e9fSE Android	snprintf(path, sizeof path, "%s/local.users", usersdir);
329255e72915d4cbddceb435e13d81601755714e9fSE Android	if (load_users(policydb, path) < 0) {
330255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(NULL, "unable to load local.users: %s", strerror(errno));
331255e72915d4cbddceb435e13d81601755714e9fSE Android		return -1;
332255e72915d4cbddceb435e13d81601755714e9fSE Android	}
333255e72915d4cbddceb435e13d81601755714e9fSE Android
334255e72915d4cbddceb435e13d81601755714e9fSE Android	if (policydb_reindex_users(policydb) < 0) {
335255e72915d4cbddceb435e13d81601755714e9fSE Android		ERR(NULL, "unable to reindex users: %s", strerror(errno));
336255e72915d4cbddceb435e13d81601755714e9fSE Android		return -1;
337255e72915d4cbddceb435e13d81601755714e9fSE Android
338255e72915d4cbddceb435e13d81601755714e9fSE Android	}
339255e72915d4cbddceb435e13d81601755714e9fSE Android
340255e72915d4cbddceb435e13d81601755714e9fSE Android	return 0;
341255e72915d4cbddceb435e13d81601755714e9fSE Android}
342255e72915d4cbddceb435e13d81601755714e9fSE Android
343255e72915d4cbddceb435e13d81601755714e9fSE Android/* -- End Deprecated -- */
344