• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/security/selinux/ss/
1/*
2 * Implementation of the policy database.
3 *
4 * Author : Stephen Smalley, <sds@epoch.ncsc.mil>
5 */
6
7/*
8 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
9 *
10 *	Support for enhanced MLS infrastructure.
11 *
12 * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
13 *
14 *	Added conditional policy language extensions
15 *
16 * Updated: Hewlett-Packard <paul.moore@hp.com>
17 *
18 *      Added support for the policy capability bitmap
19 *
20 * Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
21 * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
22 * Copyright (C) 2003 - 2004 Tresys Technology, LLC
23 *	This program is free software; you can redistribute it and/or modify
24 *	it under the terms of the GNU General Public License as published by
25 *	the Free Software Foundation, version 2.
26 */
27
28#include <linux/kernel.h>
29#include <linux/sched.h>
30#include <linux/slab.h>
31#include <linux/string.h>
32#include <linux/errno.h>
33#include <linux/audit.h>
34#include <linux/flex_array.h>
35#include "security.h"
36
37#include "policydb.h"
38#include "conditional.h"
39#include "mls.h"
40
41#define _DEBUG_HASHES
42
43#ifdef DEBUG_HASHES
44static const char *symtab_name[SYM_NUM] = {
45	"common prefixes",
46	"classes",
47	"roles",
48	"types",
49	"users",
50	"bools",
51	"levels",
52	"categories",
53};
54#endif
55
56static unsigned int symtab_sizes[SYM_NUM] = {
57	2,
58	32,
59	16,
60	512,
61	128,
62	16,
63	16,
64	16,
65};
66
67struct policydb_compat_info {
68	int version;
69	int sym_num;
70	int ocon_num;
71};
72
73/* These need to be updated if SYM_NUM or OCON_NUM changes */
74static struct policydb_compat_info policydb_compat[] = {
75	{
76		.version	= POLICYDB_VERSION_BASE,
77		.sym_num	= SYM_NUM - 3,
78		.ocon_num	= OCON_NUM - 1,
79	},
80	{
81		.version	= POLICYDB_VERSION_BOOL,
82		.sym_num	= SYM_NUM - 2,
83		.ocon_num	= OCON_NUM - 1,
84	},
85	{
86		.version	= POLICYDB_VERSION_IPV6,
87		.sym_num	= SYM_NUM - 2,
88		.ocon_num	= OCON_NUM,
89	},
90	{
91		.version	= POLICYDB_VERSION_NLCLASS,
92		.sym_num	= SYM_NUM - 2,
93		.ocon_num	= OCON_NUM,
94	},
95	{
96		.version	= POLICYDB_VERSION_MLS,
97		.sym_num	= SYM_NUM,
98		.ocon_num	= OCON_NUM,
99	},
100	{
101		.version	= POLICYDB_VERSION_AVTAB,
102		.sym_num	= SYM_NUM,
103		.ocon_num	= OCON_NUM,
104	},
105	{
106		.version	= POLICYDB_VERSION_RANGETRANS,
107		.sym_num	= SYM_NUM,
108		.ocon_num	= OCON_NUM,
109	},
110	{
111		.version	= POLICYDB_VERSION_POLCAP,
112		.sym_num	= SYM_NUM,
113		.ocon_num	= OCON_NUM,
114	},
115	{
116		.version	= POLICYDB_VERSION_PERMISSIVE,
117		.sym_num	= SYM_NUM,
118		.ocon_num	= OCON_NUM,
119	},
120	{
121		.version	= POLICYDB_VERSION_BOUNDARY,
122		.sym_num	= SYM_NUM,
123		.ocon_num	= OCON_NUM,
124	},
125};
126
127static struct policydb_compat_info *policydb_lookup_compat(int version)
128{
129	int i;
130	struct policydb_compat_info *info = NULL;
131
132	for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) {
133		if (policydb_compat[i].version == version) {
134			info = &policydb_compat[i];
135			break;
136		}
137	}
138	return info;
139}
140
141/*
142 * Initialize the role table.
143 */
144static int roles_init(struct policydb *p)
145{
146	char *key = NULL;
147	int rc;
148	struct role_datum *role;
149
150	role = kzalloc(sizeof(*role), GFP_KERNEL);
151	if (!role) {
152		rc = -ENOMEM;
153		goto out;
154	}
155	role->value = ++p->p_roles.nprim;
156	if (role->value != OBJECT_R_VAL) {
157		rc = -EINVAL;
158		goto out_free_role;
159	}
160	key = kstrdup(OBJECT_R, GFP_KERNEL);
161	if (!key) {
162		rc = -ENOMEM;
163		goto out_free_role;
164	}
165	rc = hashtab_insert(p->p_roles.table, key, role);
166	if (rc)
167		goto out_free_key;
168out:
169	return rc;
170
171out_free_key:
172	kfree(key);
173out_free_role:
174	kfree(role);
175	goto out;
176}
177
178static u32 rangetr_hash(struct hashtab *h, const void *k)
179{
180	const struct range_trans *key = k;
181	return (key->source_type + (key->target_type << 3) +
182		(key->target_class << 5)) & (h->size - 1);
183}
184
185static int rangetr_cmp(struct hashtab *h, const void *k1, const void *k2)
186{
187	const struct range_trans *key1 = k1, *key2 = k2;
188	return (key1->source_type != key2->source_type ||
189		key1->target_type != key2->target_type ||
190		key1->target_class != key2->target_class);
191}
192
193/*
194 * Initialize a policy database structure.
195 */
196static int policydb_init(struct policydb *p)
197{
198	int i, rc;
199
200	memset(p, 0, sizeof(*p));
201
202	for (i = 0; i < SYM_NUM; i++) {
203		rc = symtab_init(&p->symtab[i], symtab_sizes[i]);
204		if (rc)
205			goto out_free_symtab;
206	}
207
208	rc = avtab_init(&p->te_avtab);
209	if (rc)
210		goto out_free_symtab;
211
212	rc = roles_init(p);
213	if (rc)
214		goto out_free_symtab;
215
216	rc = cond_policydb_init(p);
217	if (rc)
218		goto out_free_symtab;
219
220	p->range_tr = hashtab_create(rangetr_hash, rangetr_cmp, 256);
221	if (!p->range_tr)
222		goto out_free_symtab;
223
224	ebitmap_init(&p->policycaps);
225	ebitmap_init(&p->permissive_map);
226
227out:
228	return rc;
229
230out_free_symtab:
231	for (i = 0; i < SYM_NUM; i++)
232		hashtab_destroy(p->symtab[i].table);
233	goto out;
234}
235
236/*
237 * The following *_index functions are used to
238 * define the val_to_name and val_to_struct arrays
239 * in a policy database structure.  The val_to_name
240 * arrays are used when converting security context
241 * structures into string representations.  The
242 * val_to_struct arrays are used when the attributes
243 * of a class, role, or user are needed.
244 */
245
246static int common_index(void *key, void *datum, void *datap)
247{
248	struct policydb *p;
249	struct common_datum *comdatum;
250
251	comdatum = datum;
252	p = datap;
253	if (!comdatum->value || comdatum->value > p->p_commons.nprim)
254		return -EINVAL;
255	p->p_common_val_to_name[comdatum->value - 1] = key;
256	return 0;
257}
258
259static int class_index(void *key, void *datum, void *datap)
260{
261	struct policydb *p;
262	struct class_datum *cladatum;
263
264	cladatum = datum;
265	p = datap;
266	if (!cladatum->value || cladatum->value > p->p_classes.nprim)
267		return -EINVAL;
268	p->p_class_val_to_name[cladatum->value - 1] = key;
269	p->class_val_to_struct[cladatum->value - 1] = cladatum;
270	return 0;
271}
272
273static int role_index(void *key, void *datum, void *datap)
274{
275	struct policydb *p;
276	struct role_datum *role;
277
278	role = datum;
279	p = datap;
280	if (!role->value
281	    || role->value > p->p_roles.nprim
282	    || role->bounds > p->p_roles.nprim)
283		return -EINVAL;
284	p->p_role_val_to_name[role->value - 1] = key;
285	p->role_val_to_struct[role->value - 1] = role;
286	return 0;
287}
288
289static int type_index(void *key, void *datum, void *datap)
290{
291	struct policydb *p;
292	struct type_datum *typdatum;
293
294	typdatum = datum;
295	p = datap;
296
297	if (typdatum->primary) {
298		if (!typdatum->value
299		    || typdatum->value > p->p_types.nprim
300		    || typdatum->bounds > p->p_types.nprim)
301			return -EINVAL;
302		p->p_type_val_to_name[typdatum->value - 1] = key;
303		p->type_val_to_struct[typdatum->value - 1] = typdatum;
304	}
305
306	return 0;
307}
308
309static int user_index(void *key, void *datum, void *datap)
310{
311	struct policydb *p;
312	struct user_datum *usrdatum;
313
314	usrdatum = datum;
315	p = datap;
316	if (!usrdatum->value
317	    || usrdatum->value > p->p_users.nprim
318	    || usrdatum->bounds > p->p_users.nprim)
319		return -EINVAL;
320	p->p_user_val_to_name[usrdatum->value - 1] = key;
321	p->user_val_to_struct[usrdatum->value - 1] = usrdatum;
322	return 0;
323}
324
325static int sens_index(void *key, void *datum, void *datap)
326{
327	struct policydb *p;
328	struct level_datum *levdatum;
329
330	levdatum = datum;
331	p = datap;
332
333	if (!levdatum->isalias) {
334		if (!levdatum->level->sens ||
335		    levdatum->level->sens > p->p_levels.nprim)
336			return -EINVAL;
337		p->p_sens_val_to_name[levdatum->level->sens - 1] = key;
338	}
339
340	return 0;
341}
342
343static int cat_index(void *key, void *datum, void *datap)
344{
345	struct policydb *p;
346	struct cat_datum *catdatum;
347
348	catdatum = datum;
349	p = datap;
350
351	if (!catdatum->isalias) {
352		if (!catdatum->value || catdatum->value > p->p_cats.nprim)
353			return -EINVAL;
354		p->p_cat_val_to_name[catdatum->value - 1] = key;
355	}
356
357	return 0;
358}
359
360static int (*index_f[SYM_NUM]) (void *key, void *datum, void *datap) =
361{
362	common_index,
363	class_index,
364	role_index,
365	type_index,
366	user_index,
367	cond_index_bool,
368	sens_index,
369	cat_index,
370};
371
372/*
373 * Define the common val_to_name array and the class
374 * val_to_name and val_to_struct arrays in a policy
375 * database structure.
376 *
377 * Caller must clean up upon failure.
378 */
379static int policydb_index_classes(struct policydb *p)
380{
381	int rc;
382
383	p->p_common_val_to_name =
384		kmalloc(p->p_commons.nprim * sizeof(char *), GFP_KERNEL);
385	if (!p->p_common_val_to_name) {
386		rc = -ENOMEM;
387		goto out;
388	}
389
390	rc = hashtab_map(p->p_commons.table, common_index, p);
391	if (rc)
392		goto out;
393
394	p->class_val_to_struct =
395		kmalloc(p->p_classes.nprim * sizeof(*(p->class_val_to_struct)), GFP_KERNEL);
396	if (!p->class_val_to_struct) {
397		rc = -ENOMEM;
398		goto out;
399	}
400
401	p->p_class_val_to_name =
402		kmalloc(p->p_classes.nprim * sizeof(char *), GFP_KERNEL);
403	if (!p->p_class_val_to_name) {
404		rc = -ENOMEM;
405		goto out;
406	}
407
408	rc = hashtab_map(p->p_classes.table, class_index, p);
409out:
410	return rc;
411}
412
413#ifdef DEBUG_HASHES
414static void symtab_hash_eval(struct symtab *s)
415{
416	int i;
417
418	for (i = 0; i < SYM_NUM; i++) {
419		struct hashtab *h = s[i].table;
420		struct hashtab_info info;
421
422		hashtab_stat(h, &info);
423		printk(KERN_DEBUG "SELinux: %s:  %d entries and %d/%d buckets used, "
424		       "longest chain length %d\n", symtab_name[i], h->nel,
425		       info.slots_used, h->size, info.max_chain_len);
426	}
427}
428
429static void rangetr_hash_eval(struct hashtab *h)
430{
431	struct hashtab_info info;
432
433	hashtab_stat(h, &info);
434	printk(KERN_DEBUG "SELinux: rangetr:  %d entries and %d/%d buckets used, "
435	       "longest chain length %d\n", h->nel,
436	       info.slots_used, h->size, info.max_chain_len);
437}
438#else
439static inline void rangetr_hash_eval(struct hashtab *h)
440{
441}
442#endif
443
444/*
445 * Define the other val_to_name and val_to_struct arrays
446 * in a policy database structure.
447 *
448 * Caller must clean up on failure.
449 */
450static int policydb_index_others(struct policydb *p)
451{
452	int i, rc = 0;
453
454	printk(KERN_DEBUG "SELinux:  %d users, %d roles, %d types, %d bools",
455	       p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim, p->p_bools.nprim);
456	if (p->mls_enabled)
457		printk(", %d sens, %d cats", p->p_levels.nprim,
458		       p->p_cats.nprim);
459	printk("\n");
460
461	printk(KERN_DEBUG "SELinux:  %d classes, %d rules\n",
462	       p->p_classes.nprim, p->te_avtab.nel);
463
464#ifdef DEBUG_HASHES
465	avtab_hash_eval(&p->te_avtab, "rules");
466	symtab_hash_eval(p->symtab);
467#endif
468
469	p->role_val_to_struct =
470		kmalloc(p->p_roles.nprim * sizeof(*(p->role_val_to_struct)),
471			GFP_KERNEL);
472	if (!p->role_val_to_struct) {
473		rc = -ENOMEM;
474		goto out;
475	}
476
477	p->user_val_to_struct =
478		kmalloc(p->p_users.nprim * sizeof(*(p->user_val_to_struct)),
479			GFP_KERNEL);
480	if (!p->user_val_to_struct) {
481		rc = -ENOMEM;
482		goto out;
483	}
484
485	p->type_val_to_struct =
486		kmalloc(p->p_types.nprim * sizeof(*(p->type_val_to_struct)),
487			GFP_KERNEL);
488	if (!p->type_val_to_struct) {
489		rc = -ENOMEM;
490		goto out;
491	}
492
493	if (cond_init_bool_indexes(p)) {
494		rc = -ENOMEM;
495		goto out;
496	}
497
498	for (i = SYM_ROLES; i < SYM_NUM; i++) {
499		p->sym_val_to_name[i] =
500			kmalloc(p->symtab[i].nprim * sizeof(char *), GFP_KERNEL);
501		if (!p->sym_val_to_name[i]) {
502			rc = -ENOMEM;
503			goto out;
504		}
505		rc = hashtab_map(p->symtab[i].table, index_f[i], p);
506		if (rc)
507			goto out;
508	}
509
510out:
511	return rc;
512}
513
514/*
515 * The following *_destroy functions are used to
516 * free any memory allocated for each kind of
517 * symbol data in the policy database.
518 */
519
520static int perm_destroy(void *key, void *datum, void *p)
521{
522	kfree(key);
523	kfree(datum);
524	return 0;
525}
526
527static int common_destroy(void *key, void *datum, void *p)
528{
529	struct common_datum *comdatum;
530
531	kfree(key);
532	comdatum = datum;
533	hashtab_map(comdatum->permissions.table, perm_destroy, NULL);
534	hashtab_destroy(comdatum->permissions.table);
535	kfree(datum);
536	return 0;
537}
538
539static int cls_destroy(void *key, void *datum, void *p)
540{
541	struct class_datum *cladatum;
542	struct constraint_node *constraint, *ctemp;
543	struct constraint_expr *e, *etmp;
544
545	kfree(key);
546	cladatum = datum;
547	hashtab_map(cladatum->permissions.table, perm_destroy, NULL);
548	hashtab_destroy(cladatum->permissions.table);
549	constraint = cladatum->constraints;
550	while (constraint) {
551		e = constraint->expr;
552		while (e) {
553			ebitmap_destroy(&e->names);
554			etmp = e;
555			e = e->next;
556			kfree(etmp);
557		}
558		ctemp = constraint;
559		constraint = constraint->next;
560		kfree(ctemp);
561	}
562
563	constraint = cladatum->validatetrans;
564	while (constraint) {
565		e = constraint->expr;
566		while (e) {
567			ebitmap_destroy(&e->names);
568			etmp = e;
569			e = e->next;
570			kfree(etmp);
571		}
572		ctemp = constraint;
573		constraint = constraint->next;
574		kfree(ctemp);
575	}
576
577	kfree(cladatum->comkey);
578	kfree(datum);
579	return 0;
580}
581
582static int role_destroy(void *key, void *datum, void *p)
583{
584	struct role_datum *role;
585
586	kfree(key);
587	role = datum;
588	ebitmap_destroy(&role->dominates);
589	ebitmap_destroy(&role->types);
590	kfree(datum);
591	return 0;
592}
593
594static int type_destroy(void *key, void *datum, void *p)
595{
596	kfree(key);
597	kfree(datum);
598	return 0;
599}
600
601static int user_destroy(void *key, void *datum, void *p)
602{
603	struct user_datum *usrdatum;
604
605	kfree(key);
606	usrdatum = datum;
607	ebitmap_destroy(&usrdatum->roles);
608	ebitmap_destroy(&usrdatum->range.level[0].cat);
609	ebitmap_destroy(&usrdatum->range.level[1].cat);
610	ebitmap_destroy(&usrdatum->dfltlevel.cat);
611	kfree(datum);
612	return 0;
613}
614
615static int sens_destroy(void *key, void *datum, void *p)
616{
617	struct level_datum *levdatum;
618
619	kfree(key);
620	levdatum = datum;
621	ebitmap_destroy(&levdatum->level->cat);
622	kfree(levdatum->level);
623	kfree(datum);
624	return 0;
625}
626
627static int cat_destroy(void *key, void *datum, void *p)
628{
629	kfree(key);
630	kfree(datum);
631	return 0;
632}
633
634static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) =
635{
636	common_destroy,
637	cls_destroy,
638	role_destroy,
639	type_destroy,
640	user_destroy,
641	cond_destroy_bool,
642	sens_destroy,
643	cat_destroy,
644};
645
646static int range_tr_destroy(void *key, void *datum, void *p)
647{
648	struct mls_range *rt = datum;
649	kfree(key);
650	ebitmap_destroy(&rt->level[0].cat);
651	ebitmap_destroy(&rt->level[1].cat);
652	kfree(datum);
653	cond_resched();
654	return 0;
655}
656
657static void ocontext_destroy(struct ocontext *c, int i)
658{
659	if (!c)
660		return;
661
662	context_destroy(&c->context[0]);
663	context_destroy(&c->context[1]);
664	if (i == OCON_ISID || i == OCON_FS ||
665	    i == OCON_NETIF || i == OCON_FSUSE)
666		kfree(c->u.name);
667	kfree(c);
668}
669
670/*
671 * Free any memory allocated by a policy database structure.
672 */
673void policydb_destroy(struct policydb *p)
674{
675	struct ocontext *c, *ctmp;
676	struct genfs *g, *gtmp;
677	int i;
678	struct role_allow *ra, *lra = NULL;
679	struct role_trans *tr, *ltr = NULL;
680
681	for (i = 0; i < SYM_NUM; i++) {
682		cond_resched();
683		hashtab_map(p->symtab[i].table, destroy_f[i], NULL);
684		hashtab_destroy(p->symtab[i].table);
685	}
686
687	for (i = 0; i < SYM_NUM; i++)
688		kfree(p->sym_val_to_name[i]);
689
690	kfree(p->class_val_to_struct);
691	kfree(p->role_val_to_struct);
692	kfree(p->user_val_to_struct);
693	kfree(p->type_val_to_struct);
694
695	avtab_destroy(&p->te_avtab);
696
697	for (i = 0; i < OCON_NUM; i++) {
698		cond_resched();
699		c = p->ocontexts[i];
700		while (c) {
701			ctmp = c;
702			c = c->next;
703			ocontext_destroy(ctmp, i);
704		}
705		p->ocontexts[i] = NULL;
706	}
707
708	g = p->genfs;
709	while (g) {
710		cond_resched();
711		kfree(g->fstype);
712		c = g->head;
713		while (c) {
714			ctmp = c;
715			c = c->next;
716			ocontext_destroy(ctmp, OCON_FSUSE);
717		}
718		gtmp = g;
719		g = g->next;
720		kfree(gtmp);
721	}
722	p->genfs = NULL;
723
724	cond_policydb_destroy(p);
725
726	for (tr = p->role_tr; tr; tr = tr->next) {
727		cond_resched();
728		kfree(ltr);
729		ltr = tr;
730	}
731	kfree(ltr);
732
733	for (ra = p->role_allow; ra; ra = ra->next) {
734		cond_resched();
735		kfree(lra);
736		lra = ra;
737	}
738	kfree(lra);
739
740	hashtab_map(p->range_tr, range_tr_destroy, NULL);
741	hashtab_destroy(p->range_tr);
742
743	if (p->type_attr_map_array) {
744		for (i = 0; i < p->p_types.nprim; i++) {
745			struct ebitmap *e;
746
747			e = flex_array_get(p->type_attr_map_array, i);
748			if (!e)
749				continue;
750			ebitmap_destroy(e);
751		}
752		flex_array_free(p->type_attr_map_array);
753	}
754	ebitmap_destroy(&p->policycaps);
755	ebitmap_destroy(&p->permissive_map);
756
757	return;
758}
759
760/*
761 * Load the initial SIDs specified in a policy database
762 * structure into a SID table.
763 */
764int policydb_load_isids(struct policydb *p, struct sidtab *s)
765{
766	struct ocontext *head, *c;
767	int rc;
768
769	rc = sidtab_init(s);
770	if (rc) {
771		printk(KERN_ERR "SELinux:  out of memory on SID table init\n");
772		goto out;
773	}
774
775	head = p->ocontexts[OCON_ISID];
776	for (c = head; c; c = c->next) {
777		if (!c->context[0].user) {
778			printk(KERN_ERR "SELinux:  SID %s was never "
779			       "defined.\n", c->u.name);
780			rc = -EINVAL;
781			goto out;
782		}
783		if (sidtab_insert(s, c->sid[0], &c->context[0])) {
784			printk(KERN_ERR "SELinux:  unable to load initial "
785			       "SID %s.\n", c->u.name);
786			rc = -EINVAL;
787			goto out;
788		}
789	}
790out:
791	return rc;
792}
793
794int policydb_class_isvalid(struct policydb *p, unsigned int class)
795{
796	if (!class || class > p->p_classes.nprim)
797		return 0;
798	return 1;
799}
800
801int policydb_role_isvalid(struct policydb *p, unsigned int role)
802{
803	if (!role || role > p->p_roles.nprim)
804		return 0;
805	return 1;
806}
807
808int policydb_type_isvalid(struct policydb *p, unsigned int type)
809{
810	if (!type || type > p->p_types.nprim)
811		return 0;
812	return 1;
813}
814
815/*
816 * Return 1 if the fields in the security context
817 * structure `c' are valid.  Return 0 otherwise.
818 */
819int policydb_context_isvalid(struct policydb *p, struct context *c)
820{
821	struct role_datum *role;
822	struct user_datum *usrdatum;
823
824	if (!c->role || c->role > p->p_roles.nprim)
825		return 0;
826
827	if (!c->user || c->user > p->p_users.nprim)
828		return 0;
829
830	if (!c->type || c->type > p->p_types.nprim)
831		return 0;
832
833	if (c->role != OBJECT_R_VAL) {
834		/*
835		 * Role must be authorized for the type.
836		 */
837		role = p->role_val_to_struct[c->role - 1];
838		if (!ebitmap_get_bit(&role->types,
839				     c->type - 1))
840			/* role may not be associated with type */
841			return 0;
842
843		/*
844		 * User must be authorized for the role.
845		 */
846		usrdatum = p->user_val_to_struct[c->user - 1];
847		if (!usrdatum)
848			return 0;
849
850		if (!ebitmap_get_bit(&usrdatum->roles,
851				     c->role - 1))
852			/* user may not be associated with role */
853			return 0;
854	}
855
856	if (!mls_context_isvalid(p, c))
857		return 0;
858
859	return 1;
860}
861
862/*
863 * Read a MLS range structure from a policydb binary
864 * representation file.
865 */
866static int mls_read_range_helper(struct mls_range *r, void *fp)
867{
868	__le32 buf[2];
869	u32 items;
870	int rc;
871
872	rc = next_entry(buf, fp, sizeof(u32));
873	if (rc < 0)
874		goto out;
875
876	items = le32_to_cpu(buf[0]);
877	if (items > ARRAY_SIZE(buf)) {
878		printk(KERN_ERR "SELinux: mls:  range overflow\n");
879		rc = -EINVAL;
880		goto out;
881	}
882	rc = next_entry(buf, fp, sizeof(u32) * items);
883	if (rc < 0) {
884		printk(KERN_ERR "SELinux: mls:  truncated range\n");
885		goto out;
886	}
887	r->level[0].sens = le32_to_cpu(buf[0]);
888	if (items > 1)
889		r->level[1].sens = le32_to_cpu(buf[1]);
890	else
891		r->level[1].sens = r->level[0].sens;
892
893	rc = ebitmap_read(&r->level[0].cat, fp);
894	if (rc) {
895		printk(KERN_ERR "SELinux: mls:  error reading low "
896		       "categories\n");
897		goto out;
898	}
899	if (items > 1) {
900		rc = ebitmap_read(&r->level[1].cat, fp);
901		if (rc) {
902			printk(KERN_ERR "SELinux: mls:  error reading high "
903			       "categories\n");
904			goto bad_high;
905		}
906	} else {
907		rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat);
908		if (rc) {
909			printk(KERN_ERR "SELinux: mls:  out of memory\n");
910			goto bad_high;
911		}
912	}
913
914	rc = 0;
915out:
916	return rc;
917bad_high:
918	ebitmap_destroy(&r->level[0].cat);
919	goto out;
920}
921
922/*
923 * Read and validate a security context structure
924 * from a policydb binary representation file.
925 */
926static int context_read_and_validate(struct context *c,
927				     struct policydb *p,
928				     void *fp)
929{
930	__le32 buf[3];
931	int rc;
932
933	rc = next_entry(buf, fp, sizeof buf);
934	if (rc < 0) {
935		printk(KERN_ERR "SELinux: context truncated\n");
936		goto out;
937	}
938	c->user = le32_to_cpu(buf[0]);
939	c->role = le32_to_cpu(buf[1]);
940	c->type = le32_to_cpu(buf[2]);
941	if (p->policyvers >= POLICYDB_VERSION_MLS) {
942		if (mls_read_range_helper(&c->range, fp)) {
943			printk(KERN_ERR "SELinux: error reading MLS range of "
944			       "context\n");
945			rc = -EINVAL;
946			goto out;
947		}
948	}
949
950	if (!policydb_context_isvalid(p, c)) {
951		printk(KERN_ERR "SELinux:  invalid security context\n");
952		context_destroy(c);
953		rc = -EINVAL;
954	}
955out:
956	return rc;
957}
958
959/*
960 * The following *_read functions are used to
961 * read the symbol data from a policy database
962 * binary representation file.
963 */
964
965static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
966{
967	char *key = NULL;
968	struct perm_datum *perdatum;
969	int rc;
970	__le32 buf[2];
971	u32 len;
972
973	perdatum = kzalloc(sizeof(*perdatum), GFP_KERNEL);
974	if (!perdatum) {
975		rc = -ENOMEM;
976		goto out;
977	}
978
979	rc = next_entry(buf, fp, sizeof buf);
980	if (rc < 0)
981		goto bad;
982
983	len = le32_to_cpu(buf[0]);
984	perdatum->value = le32_to_cpu(buf[1]);
985
986	key = kmalloc(len + 1, GFP_KERNEL);
987	if (!key) {
988		rc = -ENOMEM;
989		goto bad;
990	}
991	rc = next_entry(key, fp, len);
992	if (rc < 0)
993		goto bad;
994	key[len] = '\0';
995
996	rc = hashtab_insert(h, key, perdatum);
997	if (rc)
998		goto bad;
999out:
1000	return rc;
1001bad:
1002	perm_destroy(key, perdatum, NULL);
1003	goto out;
1004}
1005
1006static int common_read(struct policydb *p, struct hashtab *h, void *fp)
1007{
1008	char *key = NULL;
1009	struct common_datum *comdatum;
1010	__le32 buf[4];
1011	u32 len, nel;
1012	int i, rc;
1013
1014	comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL);
1015	if (!comdatum) {
1016		rc = -ENOMEM;
1017		goto out;
1018	}
1019
1020	rc = next_entry(buf, fp, sizeof buf);
1021	if (rc < 0)
1022		goto bad;
1023
1024	len = le32_to_cpu(buf[0]);
1025	comdatum->value = le32_to_cpu(buf[1]);
1026
1027	rc = symtab_init(&comdatum->permissions, PERM_SYMTAB_SIZE);
1028	if (rc)
1029		goto bad;
1030	comdatum->permissions.nprim = le32_to_cpu(buf[2]);
1031	nel = le32_to_cpu(buf[3]);
1032
1033	key = kmalloc(len + 1, GFP_KERNEL);
1034	if (!key) {
1035		rc = -ENOMEM;
1036		goto bad;
1037	}
1038	rc = next_entry(key, fp, len);
1039	if (rc < 0)
1040		goto bad;
1041	key[len] = '\0';
1042
1043	for (i = 0; i < nel; i++) {
1044		rc = perm_read(p, comdatum->permissions.table, fp);
1045		if (rc)
1046			goto bad;
1047	}
1048
1049	rc = hashtab_insert(h, key, comdatum);
1050	if (rc)
1051		goto bad;
1052out:
1053	return rc;
1054bad:
1055	common_destroy(key, comdatum, NULL);
1056	goto out;
1057}
1058
1059static int read_cons_helper(struct constraint_node **nodep, int ncons,
1060			    int allowxtarget, void *fp)
1061{
1062	struct constraint_node *c, *lc;
1063	struct constraint_expr *e, *le;
1064	__le32 buf[3];
1065	u32 nexpr;
1066	int rc, i, j, depth;
1067
1068	lc = NULL;
1069	for (i = 0; i < ncons; i++) {
1070		c = kzalloc(sizeof(*c), GFP_KERNEL);
1071		if (!c)
1072			return -ENOMEM;
1073
1074		if (lc)
1075			lc->next = c;
1076		else
1077			*nodep = c;
1078
1079		rc = next_entry(buf, fp, (sizeof(u32) * 2));
1080		if (rc < 0)
1081			return rc;
1082		c->permissions = le32_to_cpu(buf[0]);
1083		nexpr = le32_to_cpu(buf[1]);
1084		le = NULL;
1085		depth = -1;
1086		for (j = 0; j < nexpr; j++) {
1087			e = kzalloc(sizeof(*e), GFP_KERNEL);
1088			if (!e)
1089				return -ENOMEM;
1090
1091			if (le)
1092				le->next = e;
1093			else
1094				c->expr = e;
1095
1096			rc = next_entry(buf, fp, (sizeof(u32) * 3));
1097			if (rc < 0)
1098				return rc;
1099			e->expr_type = le32_to_cpu(buf[0]);
1100			e->attr = le32_to_cpu(buf[1]);
1101			e->op = le32_to_cpu(buf[2]);
1102
1103			switch (e->expr_type) {
1104			case CEXPR_NOT:
1105				if (depth < 0)
1106					return -EINVAL;
1107				break;
1108			case CEXPR_AND:
1109			case CEXPR_OR:
1110				if (depth < 1)
1111					return -EINVAL;
1112				depth--;
1113				break;
1114			case CEXPR_ATTR:
1115				if (depth == (CEXPR_MAXDEPTH - 1))
1116					return -EINVAL;
1117				depth++;
1118				break;
1119			case CEXPR_NAMES:
1120				if (!allowxtarget && (e->attr & CEXPR_XTARGET))
1121					return -EINVAL;
1122				if (depth == (CEXPR_MAXDEPTH - 1))
1123					return -EINVAL;
1124				depth++;
1125				if (ebitmap_read(&e->names, fp))
1126					return -EINVAL;
1127				break;
1128			default:
1129				return -EINVAL;
1130			}
1131			le = e;
1132		}
1133		if (depth != 0)
1134			return -EINVAL;
1135		lc = c;
1136	}
1137
1138	return 0;
1139}
1140
1141static int class_read(struct policydb *p, struct hashtab *h, void *fp)
1142{
1143	char *key = NULL;
1144	struct class_datum *cladatum;
1145	__le32 buf[6];
1146	u32 len, len2, ncons, nel;
1147	int i, rc;
1148
1149	cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL);
1150	if (!cladatum) {
1151		rc = -ENOMEM;
1152		goto out;
1153	}
1154
1155	rc = next_entry(buf, fp, sizeof(u32)*6);
1156	if (rc < 0)
1157		goto bad;
1158
1159	len = le32_to_cpu(buf[0]);
1160	len2 = le32_to_cpu(buf[1]);
1161	cladatum->value = le32_to_cpu(buf[2]);
1162
1163	rc = symtab_init(&cladatum->permissions, PERM_SYMTAB_SIZE);
1164	if (rc)
1165		goto bad;
1166	cladatum->permissions.nprim = le32_to_cpu(buf[3]);
1167	nel = le32_to_cpu(buf[4]);
1168
1169	ncons = le32_to_cpu(buf[5]);
1170
1171	key = kmalloc(len + 1, GFP_KERNEL);
1172	if (!key) {
1173		rc = -ENOMEM;
1174		goto bad;
1175	}
1176	rc = next_entry(key, fp, len);
1177	if (rc < 0)
1178		goto bad;
1179	key[len] = '\0';
1180
1181	if (len2) {
1182		cladatum->comkey = kmalloc(len2 + 1, GFP_KERNEL);
1183		if (!cladatum->comkey) {
1184			rc = -ENOMEM;
1185			goto bad;
1186		}
1187		rc = next_entry(cladatum->comkey, fp, len2);
1188		if (rc < 0)
1189			goto bad;
1190		cladatum->comkey[len2] = '\0';
1191
1192		cladatum->comdatum = hashtab_search(p->p_commons.table,
1193						    cladatum->comkey);
1194		if (!cladatum->comdatum) {
1195			printk(KERN_ERR "SELinux:  unknown common %s\n",
1196			       cladatum->comkey);
1197			rc = -EINVAL;
1198			goto bad;
1199		}
1200	}
1201	for (i = 0; i < nel; i++) {
1202		rc = perm_read(p, cladatum->permissions.table, fp);
1203		if (rc)
1204			goto bad;
1205	}
1206
1207	rc = read_cons_helper(&cladatum->constraints, ncons, 0, fp);
1208	if (rc)
1209		goto bad;
1210
1211	if (p->policyvers >= POLICYDB_VERSION_VALIDATETRANS) {
1212		/* grab the validatetrans rules */
1213		rc = next_entry(buf, fp, sizeof(u32));
1214		if (rc < 0)
1215			goto bad;
1216		ncons = le32_to_cpu(buf[0]);
1217		rc = read_cons_helper(&cladatum->validatetrans, ncons, 1, fp);
1218		if (rc)
1219			goto bad;
1220	}
1221
1222	rc = hashtab_insert(h, key, cladatum);
1223	if (rc)
1224		goto bad;
1225
1226	rc = 0;
1227out:
1228	return rc;
1229bad:
1230	cls_destroy(key, cladatum, NULL);
1231	goto out;
1232}
1233
1234static int role_read(struct policydb *p, struct hashtab *h, void *fp)
1235{
1236	char *key = NULL;
1237	struct role_datum *role;
1238	int rc, to_read = 2;
1239	__le32 buf[3];
1240	u32 len;
1241
1242	role = kzalloc(sizeof(*role), GFP_KERNEL);
1243	if (!role) {
1244		rc = -ENOMEM;
1245		goto out;
1246	}
1247
1248	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1249		to_read = 3;
1250
1251	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1252	if (rc < 0)
1253		goto bad;
1254
1255	len = le32_to_cpu(buf[0]);
1256	role->value = le32_to_cpu(buf[1]);
1257	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1258		role->bounds = le32_to_cpu(buf[2]);
1259
1260	key = kmalloc(len + 1, GFP_KERNEL);
1261	if (!key) {
1262		rc = -ENOMEM;
1263		goto bad;
1264	}
1265	rc = next_entry(key, fp, len);
1266	if (rc < 0)
1267		goto bad;
1268	key[len] = '\0';
1269
1270	rc = ebitmap_read(&role->dominates, fp);
1271	if (rc)
1272		goto bad;
1273
1274	rc = ebitmap_read(&role->types, fp);
1275	if (rc)
1276		goto bad;
1277
1278	if (strcmp(key, OBJECT_R) == 0) {
1279		if (role->value != OBJECT_R_VAL) {
1280			printk(KERN_ERR "SELinux: Role %s has wrong value %d\n",
1281			       OBJECT_R, role->value);
1282			rc = -EINVAL;
1283			goto bad;
1284		}
1285		rc = 0;
1286		goto bad;
1287	}
1288
1289	rc = hashtab_insert(h, key, role);
1290	if (rc)
1291		goto bad;
1292out:
1293	return rc;
1294bad:
1295	role_destroy(key, role, NULL);
1296	goto out;
1297}
1298
1299static int type_read(struct policydb *p, struct hashtab *h, void *fp)
1300{
1301	char *key = NULL;
1302	struct type_datum *typdatum;
1303	int rc, to_read = 3;
1304	__le32 buf[4];
1305	u32 len;
1306
1307	typdatum = kzalloc(sizeof(*typdatum), GFP_KERNEL);
1308	if (!typdatum) {
1309		rc = -ENOMEM;
1310		return rc;
1311	}
1312
1313	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1314		to_read = 4;
1315
1316	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1317	if (rc < 0)
1318		goto bad;
1319
1320	len = le32_to_cpu(buf[0]);
1321	typdatum->value = le32_to_cpu(buf[1]);
1322	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) {
1323		u32 prop = le32_to_cpu(buf[2]);
1324
1325		if (prop & TYPEDATUM_PROPERTY_PRIMARY)
1326			typdatum->primary = 1;
1327		if (prop & TYPEDATUM_PROPERTY_ATTRIBUTE)
1328			typdatum->attribute = 1;
1329
1330		typdatum->bounds = le32_to_cpu(buf[3]);
1331	} else {
1332		typdatum->primary = le32_to_cpu(buf[2]);
1333	}
1334
1335	key = kmalloc(len + 1, GFP_KERNEL);
1336	if (!key) {
1337		rc = -ENOMEM;
1338		goto bad;
1339	}
1340	rc = next_entry(key, fp, len);
1341	if (rc < 0)
1342		goto bad;
1343	key[len] = '\0';
1344
1345	rc = hashtab_insert(h, key, typdatum);
1346	if (rc)
1347		goto bad;
1348out:
1349	return rc;
1350bad:
1351	type_destroy(key, typdatum, NULL);
1352	goto out;
1353}
1354
1355
1356/*
1357 * Read a MLS level structure from a policydb binary
1358 * representation file.
1359 */
1360static int mls_read_level(struct mls_level *lp, void *fp)
1361{
1362	__le32 buf[1];
1363	int rc;
1364
1365	memset(lp, 0, sizeof(*lp));
1366
1367	rc = next_entry(buf, fp, sizeof buf);
1368	if (rc < 0) {
1369		printk(KERN_ERR "SELinux: mls: truncated level\n");
1370		goto bad;
1371	}
1372	lp->sens = le32_to_cpu(buf[0]);
1373
1374	if (ebitmap_read(&lp->cat, fp)) {
1375		printk(KERN_ERR "SELinux: mls:  error reading level "
1376		       "categories\n");
1377		goto bad;
1378	}
1379
1380	return 0;
1381
1382bad:
1383	return -EINVAL;
1384}
1385
1386static int user_read(struct policydb *p, struct hashtab *h, void *fp)
1387{
1388	char *key = NULL;
1389	struct user_datum *usrdatum;
1390	int rc, to_read = 2;
1391	__le32 buf[3];
1392	u32 len;
1393
1394	usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL);
1395	if (!usrdatum) {
1396		rc = -ENOMEM;
1397		goto out;
1398	}
1399
1400	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1401		to_read = 3;
1402
1403	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1404	if (rc < 0)
1405		goto bad;
1406
1407	len = le32_to_cpu(buf[0]);
1408	usrdatum->value = le32_to_cpu(buf[1]);
1409	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1410		usrdatum->bounds = le32_to_cpu(buf[2]);
1411
1412	key = kmalloc(len + 1, GFP_KERNEL);
1413	if (!key) {
1414		rc = -ENOMEM;
1415		goto bad;
1416	}
1417	rc = next_entry(key, fp, len);
1418	if (rc < 0)
1419		goto bad;
1420	key[len] = '\0';
1421
1422	rc = ebitmap_read(&usrdatum->roles, fp);
1423	if (rc)
1424		goto bad;
1425
1426	if (p->policyvers >= POLICYDB_VERSION_MLS) {
1427		rc = mls_read_range_helper(&usrdatum->range, fp);
1428		if (rc)
1429			goto bad;
1430		rc = mls_read_level(&usrdatum->dfltlevel, fp);
1431		if (rc)
1432			goto bad;
1433	}
1434
1435	rc = hashtab_insert(h, key, usrdatum);
1436	if (rc)
1437		goto bad;
1438out:
1439	return rc;
1440bad:
1441	user_destroy(key, usrdatum, NULL);
1442	goto out;
1443}
1444
1445static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
1446{
1447	char *key = NULL;
1448	struct level_datum *levdatum;
1449	int rc;
1450	__le32 buf[2];
1451	u32 len;
1452
1453	levdatum = kzalloc(sizeof(*levdatum), GFP_ATOMIC);
1454	if (!levdatum) {
1455		rc = -ENOMEM;
1456		goto out;
1457	}
1458
1459	rc = next_entry(buf, fp, sizeof buf);
1460	if (rc < 0)
1461		goto bad;
1462
1463	len = le32_to_cpu(buf[0]);
1464	levdatum->isalias = le32_to_cpu(buf[1]);
1465
1466	key = kmalloc(len + 1, GFP_ATOMIC);
1467	if (!key) {
1468		rc = -ENOMEM;
1469		goto bad;
1470	}
1471	rc = next_entry(key, fp, len);
1472	if (rc < 0)
1473		goto bad;
1474	key[len] = '\0';
1475
1476	levdatum->level = kmalloc(sizeof(struct mls_level), GFP_ATOMIC);
1477	if (!levdatum->level) {
1478		rc = -ENOMEM;
1479		goto bad;
1480	}
1481	if (mls_read_level(levdatum->level, fp)) {
1482		rc = -EINVAL;
1483		goto bad;
1484	}
1485
1486	rc = hashtab_insert(h, key, levdatum);
1487	if (rc)
1488		goto bad;
1489out:
1490	return rc;
1491bad:
1492	sens_destroy(key, levdatum, NULL);
1493	goto out;
1494}
1495
1496static int cat_read(struct policydb *p, struct hashtab *h, void *fp)
1497{
1498	char *key = NULL;
1499	struct cat_datum *catdatum;
1500	int rc;
1501	__le32 buf[3];
1502	u32 len;
1503
1504	catdatum = kzalloc(sizeof(*catdatum), GFP_ATOMIC);
1505	if (!catdatum) {
1506		rc = -ENOMEM;
1507		goto out;
1508	}
1509
1510	rc = next_entry(buf, fp, sizeof buf);
1511	if (rc < 0)
1512		goto bad;
1513
1514	len = le32_to_cpu(buf[0]);
1515	catdatum->value = le32_to_cpu(buf[1]);
1516	catdatum->isalias = le32_to_cpu(buf[2]);
1517
1518	key = kmalloc(len + 1, GFP_ATOMIC);
1519	if (!key) {
1520		rc = -ENOMEM;
1521		goto bad;
1522	}
1523	rc = next_entry(key, fp, len);
1524	if (rc < 0)
1525		goto bad;
1526	key[len] = '\0';
1527
1528	rc = hashtab_insert(h, key, catdatum);
1529	if (rc)
1530		goto bad;
1531out:
1532	return rc;
1533
1534bad:
1535	cat_destroy(key, catdatum, NULL);
1536	goto out;
1537}
1538
1539static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) =
1540{
1541	common_read,
1542	class_read,
1543	role_read,
1544	type_read,
1545	user_read,
1546	cond_read_bool,
1547	sens_read,
1548	cat_read,
1549};
1550
1551static int user_bounds_sanity_check(void *key, void *datum, void *datap)
1552{
1553	struct user_datum *upper, *user;
1554	struct policydb *p = datap;
1555	int depth = 0;
1556
1557	upper = user = datum;
1558	while (upper->bounds) {
1559		struct ebitmap_node *node;
1560		unsigned long bit;
1561
1562		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1563			printk(KERN_ERR "SELinux: user %s: "
1564			       "too deep or looped boundary",
1565			       (char *) key);
1566			return -EINVAL;
1567		}
1568
1569		upper = p->user_val_to_struct[upper->bounds - 1];
1570		ebitmap_for_each_positive_bit(&user->roles, node, bit) {
1571			if (ebitmap_get_bit(&upper->roles, bit))
1572				continue;
1573
1574			printk(KERN_ERR
1575			       "SELinux: boundary violated policy: "
1576			       "user=%s role=%s bounds=%s\n",
1577			       p->p_user_val_to_name[user->value - 1],
1578			       p->p_role_val_to_name[bit],
1579			       p->p_user_val_to_name[upper->value - 1]);
1580
1581			return -EINVAL;
1582		}
1583	}
1584
1585	return 0;
1586}
1587
1588static int role_bounds_sanity_check(void *key, void *datum, void *datap)
1589{
1590	struct role_datum *upper, *role;
1591	struct policydb *p = datap;
1592	int depth = 0;
1593
1594	upper = role = datum;
1595	while (upper->bounds) {
1596		struct ebitmap_node *node;
1597		unsigned long bit;
1598
1599		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1600			printk(KERN_ERR "SELinux: role %s: "
1601			       "too deep or looped bounds\n",
1602			       (char *) key);
1603			return -EINVAL;
1604		}
1605
1606		upper = p->role_val_to_struct[upper->bounds - 1];
1607		ebitmap_for_each_positive_bit(&role->types, node, bit) {
1608			if (ebitmap_get_bit(&upper->types, bit))
1609				continue;
1610
1611			printk(KERN_ERR
1612			       "SELinux: boundary violated policy: "
1613			       "role=%s type=%s bounds=%s\n",
1614			       p->p_role_val_to_name[role->value - 1],
1615			       p->p_type_val_to_name[bit],
1616			       p->p_role_val_to_name[upper->value - 1]);
1617
1618			return -EINVAL;
1619		}
1620	}
1621
1622	return 0;
1623}
1624
1625static int type_bounds_sanity_check(void *key, void *datum, void *datap)
1626{
1627	struct type_datum *upper, *type;
1628	struct policydb *p = datap;
1629	int depth = 0;
1630
1631	upper = type = datum;
1632	while (upper->bounds) {
1633		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1634			printk(KERN_ERR "SELinux: type %s: "
1635			       "too deep or looped boundary\n",
1636			       (char *) key);
1637			return -EINVAL;
1638		}
1639
1640		upper = p->type_val_to_struct[upper->bounds - 1];
1641		if (upper->attribute) {
1642			printk(KERN_ERR "SELinux: type %s: "
1643			       "bounded by attribute %s",
1644			       (char *) key,
1645			       p->p_type_val_to_name[upper->value - 1]);
1646			return -EINVAL;
1647		}
1648	}
1649
1650	return 0;
1651}
1652
1653static int policydb_bounds_sanity_check(struct policydb *p)
1654{
1655	int rc;
1656
1657	if (p->policyvers < POLICYDB_VERSION_BOUNDARY)
1658		return 0;
1659
1660	rc = hashtab_map(p->p_users.table,
1661			 user_bounds_sanity_check, p);
1662	if (rc)
1663		return rc;
1664
1665	rc = hashtab_map(p->p_roles.table,
1666			 role_bounds_sanity_check, p);
1667	if (rc)
1668		return rc;
1669
1670	rc = hashtab_map(p->p_types.table,
1671			 type_bounds_sanity_check, p);
1672	if (rc)
1673		return rc;
1674
1675	return 0;
1676}
1677
1678extern int ss_initialized;
1679
1680u16 string_to_security_class(struct policydb *p, const char *name)
1681{
1682	struct class_datum *cladatum;
1683
1684	cladatum = hashtab_search(p->p_classes.table, name);
1685	if (!cladatum)
1686		return 0;
1687
1688	return cladatum->value;
1689}
1690
1691u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name)
1692{
1693	struct class_datum *cladatum;
1694	struct perm_datum *perdatum = NULL;
1695	struct common_datum *comdatum;
1696
1697	if (!tclass || tclass > p->p_classes.nprim)
1698		return 0;
1699
1700	cladatum = p->class_val_to_struct[tclass-1];
1701	comdatum = cladatum->comdatum;
1702	if (comdatum)
1703		perdatum = hashtab_search(comdatum->permissions.table,
1704					  name);
1705	if (!perdatum)
1706		perdatum = hashtab_search(cladatum->permissions.table,
1707					  name);
1708	if (!perdatum)
1709		return 0;
1710
1711	return 1U << (perdatum->value-1);
1712}
1713
1714static int range_read(struct policydb *p, void *fp)
1715{
1716	struct range_trans *rt = NULL;
1717	struct mls_range *r = NULL;
1718	int i, rc;
1719	__le32 buf[2];
1720	u32 nel;
1721
1722	if (p->policyvers < POLICYDB_VERSION_MLS)
1723		return 0;
1724
1725	rc = next_entry(buf, fp, sizeof(u32));
1726	if (rc)
1727		goto out;
1728
1729	nel = le32_to_cpu(buf[0]);
1730	for (i = 0; i < nel; i++) {
1731		rc = -ENOMEM;
1732		rt = kzalloc(sizeof(*rt), GFP_KERNEL);
1733		if (!rt)
1734			goto out;
1735
1736		rc = next_entry(buf, fp, (sizeof(u32) * 2));
1737		if (rc)
1738			goto out;
1739
1740		rt->source_type = le32_to_cpu(buf[0]);
1741		rt->target_type = le32_to_cpu(buf[1]);
1742		if (p->policyvers >= POLICYDB_VERSION_RANGETRANS) {
1743			rc = next_entry(buf, fp, sizeof(u32));
1744			if (rc)
1745				goto out;
1746			rt->target_class = le32_to_cpu(buf[0]);
1747		} else
1748			rt->target_class = p->process_class;
1749
1750		rc = -EINVAL;
1751		if (!policydb_type_isvalid(p, rt->source_type) ||
1752		    !policydb_type_isvalid(p, rt->target_type) ||
1753		    !policydb_class_isvalid(p, rt->target_class))
1754			goto out;
1755
1756		rc = -ENOMEM;
1757		r = kzalloc(sizeof(*r), GFP_KERNEL);
1758		if (!r)
1759			goto out;
1760
1761		rc = mls_read_range_helper(r, fp);
1762		if (rc)
1763			goto out;
1764
1765		rc = -EINVAL;
1766		if (!mls_range_isvalid(p, r)) {
1767			printk(KERN_WARNING "SELinux:  rangetrans:  invalid range\n");
1768			goto out;
1769		}
1770
1771		rc = hashtab_insert(p->range_tr, rt, r);
1772		if (rc)
1773			goto out;
1774
1775		rt = NULL;
1776		r = NULL;
1777	}
1778	rangetr_hash_eval(p->range_tr);
1779	rc = 0;
1780out:
1781	kfree(rt);
1782	kfree(r);
1783	return rc;
1784}
1785
1786static int genfs_read(struct policydb *p, void *fp)
1787{
1788	int i, j, rc;
1789	u32 nel, nel2, len, len2;
1790	__le32 buf[1];
1791	struct ocontext *l, *c;
1792	struct ocontext *newc = NULL;
1793	struct genfs *genfs_p, *genfs;
1794	struct genfs *newgenfs = NULL;
1795
1796	rc = next_entry(buf, fp, sizeof(u32));
1797	if (rc)
1798		goto out;
1799	nel = le32_to_cpu(buf[0]);
1800
1801	for (i = 0; i < nel; i++) {
1802		rc = next_entry(buf, fp, sizeof(u32));
1803		if (rc)
1804			goto out;
1805		len = le32_to_cpu(buf[0]);
1806
1807		rc = -ENOMEM;
1808		newgenfs = kzalloc(sizeof(*newgenfs), GFP_KERNEL);
1809		if (!newgenfs)
1810			goto out;
1811
1812		rc = -ENOMEM;
1813		newgenfs->fstype = kmalloc(len + 1, GFP_KERNEL);
1814		if (!newgenfs->fstype)
1815			goto out;
1816
1817		rc = next_entry(newgenfs->fstype, fp, len);
1818		if (rc)
1819			goto out;
1820
1821		newgenfs->fstype[len] = 0;
1822
1823		for (genfs_p = NULL, genfs = p->genfs; genfs;
1824		     genfs_p = genfs, genfs = genfs->next) {
1825			rc = -EINVAL;
1826			if (strcmp(newgenfs->fstype, genfs->fstype) == 0) {
1827				printk(KERN_ERR "SELinux:  dup genfs fstype %s\n",
1828				       newgenfs->fstype);
1829				goto out;
1830			}
1831			if (strcmp(newgenfs->fstype, genfs->fstype) < 0)
1832				break;
1833		}
1834		newgenfs->next = genfs;
1835		if (genfs_p)
1836			genfs_p->next = newgenfs;
1837		else
1838			p->genfs = newgenfs;
1839		genfs = newgenfs;
1840		newgenfs = NULL;
1841
1842		rc = next_entry(buf, fp, sizeof(u32));
1843		if (rc)
1844			goto out;
1845
1846		nel2 = le32_to_cpu(buf[0]);
1847		for (j = 0; j < nel2; j++) {
1848			rc = next_entry(buf, fp, sizeof(u32));
1849			if (rc)
1850				goto out;
1851			len = le32_to_cpu(buf[0]);
1852
1853			rc = -ENOMEM;
1854			newc = kzalloc(sizeof(*newc), GFP_KERNEL);
1855			if (!newc)
1856				goto out;
1857
1858			rc = -ENOMEM;
1859			newc->u.name = kmalloc(len + 1, GFP_KERNEL);
1860			if (!newc->u.name)
1861				goto out;
1862
1863			rc = next_entry(newc->u.name, fp, len);
1864			if (rc)
1865				goto out;
1866			newc->u.name[len] = 0;
1867
1868			rc = next_entry(buf, fp, sizeof(u32));
1869			if (rc)
1870				goto out;
1871
1872			newc->v.sclass = le32_to_cpu(buf[0]);
1873			rc = context_read_and_validate(&newc->context[0], p, fp);
1874			if (rc)
1875				goto out;
1876
1877			for (l = NULL, c = genfs->head; c;
1878			     l = c, c = c->next) {
1879				rc = -EINVAL;
1880				if (!strcmp(newc->u.name, c->u.name) &&
1881				    (!c->v.sclass || !newc->v.sclass ||
1882				     newc->v.sclass == c->v.sclass)) {
1883					printk(KERN_ERR "SELinux:  dup genfs entry (%s,%s)\n",
1884					       genfs->fstype, c->u.name);
1885					goto out;
1886				}
1887				len = strlen(newc->u.name);
1888				len2 = strlen(c->u.name);
1889				if (len > len2)
1890					break;
1891			}
1892
1893			newc->next = c;
1894			if (l)
1895				l->next = newc;
1896			else
1897				genfs->head = newc;
1898			newc = NULL;
1899		}
1900	}
1901	rc = 0;
1902out:
1903	if (newgenfs)
1904		kfree(newgenfs->fstype);
1905	kfree(newgenfs);
1906	ocontext_destroy(newc, OCON_FSUSE);
1907
1908	return rc;
1909}
1910
1911static int ocontext_read(struct policydb *p, struct policydb_compat_info *info,
1912			 void *fp)
1913{
1914	int i, j, rc;
1915	u32 nel, len;
1916	__le32 buf[3];
1917	struct ocontext *l, *c;
1918	u32 nodebuf[8];
1919
1920	for (i = 0; i < info->ocon_num; i++) {
1921		rc = next_entry(buf, fp, sizeof(u32));
1922		if (rc)
1923			goto out;
1924		nel = le32_to_cpu(buf[0]);
1925
1926		l = NULL;
1927		for (j = 0; j < nel; j++) {
1928			rc = -ENOMEM;
1929			c = kzalloc(sizeof(*c), GFP_KERNEL);
1930			if (!c)
1931				goto out;
1932			if (l)
1933				l->next = c;
1934			else
1935				p->ocontexts[i] = c;
1936			l = c;
1937
1938			switch (i) {
1939			case OCON_ISID:
1940				rc = next_entry(buf, fp, sizeof(u32));
1941				if (rc)
1942					goto out;
1943
1944				c->sid[0] = le32_to_cpu(buf[0]);
1945				rc = context_read_and_validate(&c->context[0], p, fp);
1946				if (rc)
1947					goto out;
1948				break;
1949			case OCON_FS:
1950			case OCON_NETIF:
1951				rc = next_entry(buf, fp, sizeof(u32));
1952				if (rc)
1953					goto out;
1954				len = le32_to_cpu(buf[0]);
1955
1956				rc = -ENOMEM;
1957				c->u.name = kmalloc(len + 1, GFP_KERNEL);
1958				if (!c->u.name)
1959					goto out;
1960
1961				rc = next_entry(c->u.name, fp, len);
1962				if (rc)
1963					goto out;
1964
1965				c->u.name[len] = 0;
1966				rc = context_read_and_validate(&c->context[0], p, fp);
1967				if (rc)
1968					goto out;
1969				rc = context_read_and_validate(&c->context[1], p, fp);
1970				if (rc)
1971					goto out;
1972				break;
1973			case OCON_PORT:
1974				rc = next_entry(buf, fp, sizeof(u32)*3);
1975				if (rc)
1976					goto out;
1977				c->u.port.protocol = le32_to_cpu(buf[0]);
1978				c->u.port.low_port = le32_to_cpu(buf[1]);
1979				c->u.port.high_port = le32_to_cpu(buf[2]);
1980				rc = context_read_and_validate(&c->context[0], p, fp);
1981				if (rc)
1982					goto out;
1983				break;
1984			case OCON_NODE:
1985				rc = next_entry(nodebuf, fp, sizeof(u32) * 2);
1986				if (rc)
1987					goto out;
1988				c->u.node.addr = nodebuf[0]; /* network order */
1989				c->u.node.mask = nodebuf[1]; /* network order */
1990				rc = context_read_and_validate(&c->context[0], p, fp);
1991				if (rc)
1992					goto out;
1993				break;
1994			case OCON_FSUSE:
1995				rc = next_entry(buf, fp, sizeof(u32)*2);
1996				if (rc)
1997					goto out;
1998
1999				rc = -EINVAL;
2000				c->v.behavior = le32_to_cpu(buf[0]);
2001				if (c->v.behavior > SECURITY_FS_USE_NONE)
2002					goto out;
2003
2004				rc = -ENOMEM;
2005				len = le32_to_cpu(buf[1]);
2006				c->u.name = kmalloc(len + 1, GFP_KERNEL);
2007				if (!c->u.name)
2008					goto out;
2009
2010				rc = next_entry(c->u.name, fp, len);
2011				if (rc)
2012					goto out;
2013				c->u.name[len] = 0;
2014				rc = context_read_and_validate(&c->context[0], p, fp);
2015				if (rc)
2016					goto out;
2017				break;
2018			case OCON_NODE6: {
2019				int k;
2020
2021				rc = next_entry(nodebuf, fp, sizeof(u32) * 8);
2022				if (rc)
2023					goto out;
2024				for (k = 0; k < 4; k++)
2025					c->u.node6.addr[k] = nodebuf[k];
2026				for (k = 0; k < 4; k++)
2027					c->u.node6.mask[k] = nodebuf[k+4];
2028				rc = context_read_and_validate(&c->context[0], p, fp);
2029				if (rc)
2030					goto out;
2031				break;
2032			}
2033			}
2034		}
2035	}
2036	rc = 0;
2037out:
2038	return rc;
2039}
2040
2041/*
2042 * Read the configuration data from a policy database binary
2043 * representation file into a policy database structure.
2044 */
2045int policydb_read(struct policydb *p, void *fp)
2046{
2047	struct role_allow *ra, *lra;
2048	struct role_trans *tr, *ltr;
2049	int i, j, rc;
2050	__le32 buf[4];
2051	u32 len, nprim, nel;
2052
2053	char *policydb_str;
2054	struct policydb_compat_info *info;
2055
2056	rc = policydb_init(p);
2057	if (rc)
2058		goto out;
2059
2060	/* Read the magic number and string length. */
2061	rc = next_entry(buf, fp, sizeof(u32) * 2);
2062	if (rc < 0)
2063		goto bad;
2064
2065	if (le32_to_cpu(buf[0]) != POLICYDB_MAGIC) {
2066		printk(KERN_ERR "SELinux:  policydb magic number 0x%x does "
2067		       "not match expected magic number 0x%x\n",
2068		       le32_to_cpu(buf[0]), POLICYDB_MAGIC);
2069		goto bad;
2070	}
2071
2072	len = le32_to_cpu(buf[1]);
2073	if (len != strlen(POLICYDB_STRING)) {
2074		printk(KERN_ERR "SELinux:  policydb string length %d does not "
2075		       "match expected length %Zu\n",
2076		       len, strlen(POLICYDB_STRING));
2077		goto bad;
2078	}
2079	policydb_str = kmalloc(len + 1, GFP_KERNEL);
2080	if (!policydb_str) {
2081		printk(KERN_ERR "SELinux:  unable to allocate memory for policydb "
2082		       "string of length %d\n", len);
2083		rc = -ENOMEM;
2084		goto bad;
2085	}
2086	rc = next_entry(policydb_str, fp, len);
2087	if (rc < 0) {
2088		printk(KERN_ERR "SELinux:  truncated policydb string identifier\n");
2089		kfree(policydb_str);
2090		goto bad;
2091	}
2092	policydb_str[len] = '\0';
2093	if (strcmp(policydb_str, POLICYDB_STRING)) {
2094		printk(KERN_ERR "SELinux:  policydb string %s does not match "
2095		       "my string %s\n", policydb_str, POLICYDB_STRING);
2096		kfree(policydb_str);
2097		goto bad;
2098	}
2099	/* Done with policydb_str. */
2100	kfree(policydb_str);
2101	policydb_str = NULL;
2102
2103	/* Read the version and table sizes. */
2104	rc = next_entry(buf, fp, sizeof(u32)*4);
2105	if (rc < 0)
2106		goto bad;
2107
2108	p->policyvers = le32_to_cpu(buf[0]);
2109	if (p->policyvers < POLICYDB_VERSION_MIN ||
2110	    p->policyvers > POLICYDB_VERSION_MAX) {
2111		printk(KERN_ERR "SELinux:  policydb version %d does not match "
2112		       "my version range %d-%d\n",
2113		       le32_to_cpu(buf[0]), POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX);
2114		goto bad;
2115	}
2116
2117	if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_MLS)) {
2118		p->mls_enabled = 1;
2119
2120		if (p->policyvers < POLICYDB_VERSION_MLS) {
2121			printk(KERN_ERR "SELinux: security policydb version %d "
2122				"(MLS) not backwards compatible\n",
2123				p->policyvers);
2124			goto bad;
2125		}
2126	}
2127	p->reject_unknown = !!(le32_to_cpu(buf[1]) & REJECT_UNKNOWN);
2128	p->allow_unknown = !!(le32_to_cpu(buf[1]) & ALLOW_UNKNOWN);
2129
2130	if (p->policyvers >= POLICYDB_VERSION_POLCAP &&
2131	    ebitmap_read(&p->policycaps, fp) != 0)
2132		goto bad;
2133
2134	if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE &&
2135	    ebitmap_read(&p->permissive_map, fp) != 0)
2136		goto bad;
2137
2138	info = policydb_lookup_compat(p->policyvers);
2139	if (!info) {
2140		printk(KERN_ERR "SELinux:  unable to find policy compat info "
2141		       "for version %d\n", p->policyvers);
2142		goto bad;
2143	}
2144
2145	if (le32_to_cpu(buf[2]) != info->sym_num ||
2146		le32_to_cpu(buf[3]) != info->ocon_num) {
2147		printk(KERN_ERR "SELinux:  policydb table sizes (%d,%d) do "
2148		       "not match mine (%d,%d)\n", le32_to_cpu(buf[2]),
2149			le32_to_cpu(buf[3]),
2150		       info->sym_num, info->ocon_num);
2151		goto bad;
2152	}
2153
2154	for (i = 0; i < info->sym_num; i++) {
2155		rc = next_entry(buf, fp, sizeof(u32)*2);
2156		if (rc < 0)
2157			goto bad;
2158		nprim = le32_to_cpu(buf[0]);
2159		nel = le32_to_cpu(buf[1]);
2160		for (j = 0; j < nel; j++) {
2161			rc = read_f[i](p, p->symtab[i].table, fp);
2162			if (rc)
2163				goto bad;
2164		}
2165
2166		p->symtab[i].nprim = nprim;
2167	}
2168
2169	rc = avtab_read(&p->te_avtab, fp, p);
2170	if (rc)
2171		goto bad;
2172
2173	if (p->policyvers >= POLICYDB_VERSION_BOOL) {
2174		rc = cond_read_list(p, fp);
2175		if (rc)
2176			goto bad;
2177	}
2178
2179	rc = next_entry(buf, fp, sizeof(u32));
2180	if (rc < 0)
2181		goto bad;
2182	nel = le32_to_cpu(buf[0]);
2183	ltr = NULL;
2184	for (i = 0; i < nel; i++) {
2185		tr = kzalloc(sizeof(*tr), GFP_KERNEL);
2186		if (!tr) {
2187			rc = -ENOMEM;
2188			goto bad;
2189		}
2190		if (ltr)
2191			ltr->next = tr;
2192		else
2193			p->role_tr = tr;
2194		rc = next_entry(buf, fp, sizeof(u32)*3);
2195		if (rc < 0)
2196			goto bad;
2197		tr->role = le32_to_cpu(buf[0]);
2198		tr->type = le32_to_cpu(buf[1]);
2199		tr->new_role = le32_to_cpu(buf[2]);
2200		if (!policydb_role_isvalid(p, tr->role) ||
2201		    !policydb_type_isvalid(p, tr->type) ||
2202		    !policydb_role_isvalid(p, tr->new_role)) {
2203			rc = -EINVAL;
2204			goto bad;
2205		}
2206		ltr = tr;
2207	}
2208
2209	rc = next_entry(buf, fp, sizeof(u32));
2210	if (rc < 0)
2211		goto bad;
2212	nel = le32_to_cpu(buf[0]);
2213	lra = NULL;
2214	for (i = 0; i < nel; i++) {
2215		ra = kzalloc(sizeof(*ra), GFP_KERNEL);
2216		if (!ra) {
2217			rc = -ENOMEM;
2218			goto bad;
2219		}
2220		if (lra)
2221			lra->next = ra;
2222		else
2223			p->role_allow = ra;
2224		rc = next_entry(buf, fp, sizeof(u32)*2);
2225		if (rc < 0)
2226			goto bad;
2227		ra->role = le32_to_cpu(buf[0]);
2228		ra->new_role = le32_to_cpu(buf[1]);
2229		if (!policydb_role_isvalid(p, ra->role) ||
2230		    !policydb_role_isvalid(p, ra->new_role)) {
2231			rc = -EINVAL;
2232			goto bad;
2233		}
2234		lra = ra;
2235	}
2236
2237	rc = policydb_index_classes(p);
2238	if (rc)
2239		goto bad;
2240
2241	rc = policydb_index_others(p);
2242	if (rc)
2243		goto bad;
2244
2245	p->process_class = string_to_security_class(p, "process");
2246	if (!p->process_class)
2247		goto bad;
2248	p->process_trans_perms = string_to_av_perm(p, p->process_class,
2249						   "transition");
2250	p->process_trans_perms |= string_to_av_perm(p, p->process_class,
2251						    "dyntransition");
2252	if (!p->process_trans_perms)
2253		goto bad;
2254
2255	rc = ocontext_read(p, info, fp);
2256	if (rc)
2257		goto bad;
2258
2259	rc = genfs_read(p, fp);
2260	if (rc)
2261		goto bad;
2262
2263	rc = range_read(p, fp);
2264	if (rc)
2265		goto bad;
2266
2267	rc = -ENOMEM;
2268	p->type_attr_map_array = flex_array_alloc(sizeof(struct ebitmap),
2269						  p->p_types.nprim,
2270						  GFP_KERNEL | __GFP_ZERO);
2271	if (!p->type_attr_map_array)
2272		goto bad;
2273
2274	/* preallocate so we don't have to worry about the put ever failing */
2275	rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1,
2276				 GFP_KERNEL | __GFP_ZERO);
2277	if (rc)
2278		goto bad;
2279
2280	for (i = 0; i < p->p_types.nprim; i++) {
2281		struct ebitmap *e = flex_array_get(p->type_attr_map_array, i);
2282
2283		BUG_ON(!e);
2284		ebitmap_init(e);
2285		if (p->policyvers >= POLICYDB_VERSION_AVTAB) {
2286			rc = ebitmap_read(e, fp);
2287			if (rc)
2288				goto bad;
2289		}
2290		/* add the type itself as the degenerate case */
2291		rc = ebitmap_set_bit(e, i, 1);
2292		if (rc)
2293			goto bad;
2294	}
2295
2296	rc = policydb_bounds_sanity_check(p);
2297	if (rc)
2298		goto bad;
2299
2300	rc = 0;
2301out:
2302	return rc;
2303bad:
2304	if (!rc)
2305		rc = -EINVAL;
2306	policydb_destroy(p);
2307	goto out;
2308}
2309