113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdio.h>
284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h>
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <ctype.h>
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <errno.h>
613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <limits.h>
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <sepol/policydb/policydb.h>
984f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley
10bedef7d12493e5785537c1f8e46ce32c3e34bf32Stephen Smalley#ifndef __APPLE__
1184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#include <stdio_ext.h>
1284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#endif
1384f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdarg.h>
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "debug.h"
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "private.h"
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "dso.h"
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "mls.h"
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* -- Deprecated -- */
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid sepol_set_delusers(int on __attribute((unused)))
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	WARN(NULL, "Deprecated interface");
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#undef BADLINE
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define BADLINE() { \
3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ERR(NULL, "invalid entry %s (%s:%u)", \
3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		buffer, path, lineno); \
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	continue; \
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int load_users(struct policydb *policydb, const char *path)
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	FILE *fp;
3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char *buffer = NULL, *p, *q, oldc;
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ssize_t nread;
4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	unsigned lineno = 0, islist = 0, bit;
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	user_datum_t *usrdatum;
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	role_datum_t *roldatum;
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ebitmap_node_t *rnode;
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fp = fopen(path, "r");
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (fp == NULL)
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
49bedef7d12493e5785537c1f8e46ce32c3e34bf32Stephen Smalley#ifdef __APPLE__
5084f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	if ((buffer = (char *)malloc(255 * sizeof(char))) == NULL) {
5184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	  ERR(NULL, "out of memory");
5284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	  return -1;
5384f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	}
5484f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley
5584f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	while(fgets(buffer, 255, fp) != NULL) {
56d97cd6a2033c7f77c0cb5d9dfd77bdd2c7754a5bWilliam Roberts		nread = strlen(buffer);
5784f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#else
5887c5afdad247ddc458cd0d9343bd5b03793b958cWilliam Roberts	size_t len = 0;
5984f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley	__fsetlocking(fp, FSETLOCKING_BYCALLER);
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	while ((nread = getline(&buffer, &len, fp)) > 0) {
6184f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley#endif
6284f6ac246f5980f831a5777d53c0a0bd6ad17d3cStephen Smalley
6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		lineno++;
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (buffer[nread - 1] == '\n')
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			buffer[nread - 1] = 0;
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		p = buffer;
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*p && isspace(*p))
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*p) || *p == '#')
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			continue;
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (strncasecmp(p, "user", 4))
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		p += 4;
7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!isspace(*p))
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*p && isspace(*p))
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*p))
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		q = p;
8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*p && !isspace(*p))
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*p))
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		*p++ = 0;
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		usrdatum = hashtab_search(policydb->p_users.table, q);
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (usrdatum) {
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			/* Replacing an existing user definition. */
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			ebitmap_destroy(&usrdatum->roles.roles);
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			ebitmap_init(&usrdatum->roles.roles);
9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		} else {
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			char *id = strdup(q);
9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
96afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris			if (!id) {
97afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				ERR(NULL, "out of memory");
98afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				free(buffer);
99afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				fclose(fp);
100afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				return -1;
101afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris			}
102afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			/* Adding a new user definition. */
104afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris			usrdatum = malloc(sizeof(user_datum_t));
105afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris			if (!usrdatum) {
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "out of memory");
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(buffer);
108afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				free(id);
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				fclose(fp);
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				return -1;
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
112afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris
113afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris			user_datum_init(usrdatum);
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			usrdatum->s.value = ++policydb->p_users.nprim;
11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (hashtab_insert(policydb->p_users.table,
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					   id, (hashtab_datum_t) usrdatum)) {
11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "out of memory");
11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(buffer);
119afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				free(id);
120afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				user_datum_destroy(usrdatum);
121afe88d8c69543b2ebd6e25efdaab76f40ea4d3c7Eric Paris				free(usrdatum);
12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				fclose(fp);
12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				return -1;
12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		}
12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*p && isspace(*p))
12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*p))
13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (strncasecmp(p, "roles", 5))
13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		p += 5;
13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!isspace(*p))
13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		while (*p && isspace(*p))
13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (!(*p))
13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (*p == '{') {
14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			islist = 1;
14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		} else
14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			islist = 0;
14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		oldc = 0;
14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		do {
14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && isspace(*p))
14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				break;
15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			q = p;
15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && *p != ';' && *p != '}' && !isspace(*p))
15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				break;
15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (*p == '}')
15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				islist = 0;
16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			oldc = *p;
16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			*p++ = 0;
16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!q[0])
16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				break;
16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			roldatum = hashtab_search(policydb->p_roles.table, q);
16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!roldatum) {
16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "undefined role %s (%s:%u)",
16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				    q, path, lineno);
16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				continue;
17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			/* Set the role and every role it dominates */
17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			ebitmap_for_each_bit(&roldatum->dominates, rnode, bit) {
17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				if (ebitmap_node_get_bit(rnode, bit))
17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					if (ebitmap_set_bit
17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					    (&usrdatum->roles.roles, bit, 1)) {
17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle						ERR(NULL, "out of memory");
17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle						free(buffer);
17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle						fclose(fp);
17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle						return -1;
18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					}
18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		} while (islist);
18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (oldc == 0)
18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			BADLINE();
18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (policydb->mls) {
18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			context_struct_t context;
18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			char *scontext, *r, *s;
18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && isspace(*p))
19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (strncasecmp(p, "level", 5))
19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p += 5;
19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!isspace(*p))
19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && isspace(*p))
20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			q = p;
20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && strncasecmp(p, "range", 5))
20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			*--p = 0;
20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p++;
21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			scontext = malloc(p - q);
21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!scontext) {
21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "out of memory");
21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(buffer);
21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				fclose(fp);
21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				return -1;
21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			r = scontext;
21913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			s = q;
22013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*s) {
22113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				if (!isspace(*s))
22213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					*r++ = *s;
22313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				s++;
22413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
22513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			*r = 0;
22613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			r = scontext;
22713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
22813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			context_init(&context);
22913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (mls_context_to_sid(policydb, oldc, &r, &context) <
23013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			    0) {
23113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "invalid level %s (%s:%u)", scontext,
23213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				    path, lineno);
23313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(scontext);
23413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				continue;
23513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
23613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
23713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			free(scontext);
23813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			memcpy(&usrdatum->dfltlevel, &context.range.level[0],
23913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			       sizeof(usrdatum->dfltlevel));
24013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
24113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (strncasecmp(p, "range", 5))
24213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
24313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			p += 5;
24413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!isspace(*p))
24513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
24613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && isspace(*p))
24713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
24813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
24913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
25013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			q = p;
25113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*p && *p != ';')
25213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				p++;
25313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!(*p))
25413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				BADLINE();
25513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			*p++ = 0;
25613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
25713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			scontext = malloc(p - q);
25813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (!scontext) {
25913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "out of memory");
26013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(buffer);
26113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				fclose(fp);
26213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				return -1;
26313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
26413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			r = scontext;
26513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			s = q;
26613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			while (*s) {
26713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				if (!isspace(*s))
26813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					*r++ = *s;
26913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				s++;
27013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
27113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			*r = 0;
27213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			r = scontext;
27313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
27413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			context_init(&context);
27513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			if (mls_context_to_sid(policydb, oldc, &r, &context) <
27613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			    0) {
27713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				ERR(NULL, "invalid range %s (%s:%u)", scontext,
27813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				    path, lineno);
27913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				free(scontext);
28013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				continue;
28113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			}
28213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			free(scontext);
28313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			memcpy(&usrdatum->range, &context.range,
28413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			       sizeof(usrdatum->range));
28513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		}
28613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
28713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
28813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	free(buffer);
28913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fclose(fp);
29013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return 0;
29113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
29213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint sepol_genusers(void *data, size_t len,
29413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		   const char *usersdir, void **newdata, size_t * newlen)
29513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
29613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	struct policydb policydb;
29713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char path[PATH_MAX];
29813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Construct policy database */
30013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (policydb_init(&policydb))
30113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err;
30213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (policydb_from_image(NULL, data, len, &policydb) < 0)
30313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err;
30413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
30513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Load locally defined users. */
30613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	snprintf(path, sizeof path, "%s/local.users", usersdir);
30713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (load_users(&policydb, path) < 0)
30813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err_destroy;
30913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
31013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Write policy database */
31113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (policydb_to_image(NULL, &policydb, newdata, newlen) < 0)
31213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err_destroy;
31313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
31413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	policydb_destroy(&policydb);
31513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return 0;
31613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
31713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle      err_destroy:
31813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	policydb_destroy(&policydb);
31913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
32013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle      err:
32113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return -1;
32213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
32313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
32413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint hidden sepol_genusers_policydb(policydb_t * policydb, const char *usersdir)
32513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
32613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char path[PATH_MAX];
32713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
32813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Load locally defined users. */
32913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	snprintf(path, sizeof path, "%s/local.users", usersdir);
33013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (load_users(policydb, path) < 0) {
33113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(NULL, "unable to load local.users: %s", strerror(errno));
33213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
33313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
33413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
33513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (policydb_reindex_users(policydb) < 0) {
33613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(NULL, "unable to reindex users: %s", strerror(errno));
33713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return -1;
33813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
33913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
34013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
34113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return 0;
34213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
34313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
34413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* -- End Deprecated -- */
345