xref: /linux/security/selinux/ss/policydb.c (revision 06d07429858317ded2db7986113a9e0129cd599b)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Implementation of the policy database.
4  *
5  * Author : Stephen Smalley, <stephen.smalley.work@gmail.com>
6  */
7 
8 /*
9  * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
10  *
11  *	Support for enhanced MLS infrastructure.
12  *
13  * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
14  *
15  *	Added conditional policy language extensions
16  *
17  * Updated: Hewlett-Packard <paul@paul-moore.com>
18  *
19  *      Added support for the policy capability bitmap
20  *
21  * Update: Mellanox Techonologies
22  *
23  *	Added Infiniband support
24  *
25  * Copyright (C) 2016 Mellanox Techonologies
26  * Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
27  * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
28  * Copyright (C) 2003 - 2004 Tresys Technology, LLC
29  */
30 
31 #include <linux/kernel.h>
32 #include <linux/sched.h>
33 #include <linux/slab.h>
34 #include <linux/string.h>
35 #include <linux/errno.h>
36 #include <linux/audit.h>
37 #include "security.h"
38 
39 #include "policydb.h"
40 #include "conditional.h"
41 #include "mls.h"
42 #include "services.h"
43 
44 #ifdef CONFIG_SECURITY_SELINUX_DEBUG
45 static const char *const symtab_name[SYM_NUM] = {
46 	"common prefixes",
47 	"classes",
48 	"roles",
49 	"types",
50 	"users",
51 	"bools",
52 	"levels",
53 	"categories",
54 };
55 #endif
56 
57 struct policydb_compat_info {
58 	unsigned int version;
59 	unsigned int sym_num;
60 	unsigned int ocon_num;
61 };
62 
63 /* These need to be updated if SYM_NUM or OCON_NUM changes */
64 static const struct policydb_compat_info policydb_compat[] = {
65 	{
66 		.version	= POLICYDB_VERSION_BASE,
67 		.sym_num	= SYM_NUM - 3,
68 		.ocon_num	= OCON_NUM - 3,
69 	},
70 	{
71 		.version	= POLICYDB_VERSION_BOOL,
72 		.sym_num	= SYM_NUM - 2,
73 		.ocon_num	= OCON_NUM - 3,
74 	},
75 	{
76 		.version	= POLICYDB_VERSION_IPV6,
77 		.sym_num	= SYM_NUM - 2,
78 		.ocon_num	= OCON_NUM - 2,
79 	},
80 	{
81 		.version	= POLICYDB_VERSION_NLCLASS,
82 		.sym_num	= SYM_NUM - 2,
83 		.ocon_num	= OCON_NUM - 2,
84 	},
85 	{
86 		.version	= POLICYDB_VERSION_MLS,
87 		.sym_num	= SYM_NUM,
88 		.ocon_num	= OCON_NUM - 2,
89 	},
90 	{
91 		.version	= POLICYDB_VERSION_AVTAB,
92 		.sym_num	= SYM_NUM,
93 		.ocon_num	= OCON_NUM - 2,
94 	},
95 	{
96 		.version	= POLICYDB_VERSION_RANGETRANS,
97 		.sym_num	= SYM_NUM,
98 		.ocon_num	= OCON_NUM - 2,
99 	},
100 	{
101 		.version	= POLICYDB_VERSION_POLCAP,
102 		.sym_num	= SYM_NUM,
103 		.ocon_num	= OCON_NUM - 2,
104 	},
105 	{
106 		.version	= POLICYDB_VERSION_PERMISSIVE,
107 		.sym_num	= SYM_NUM,
108 		.ocon_num	= OCON_NUM - 2,
109 	},
110 	{
111 		.version	= POLICYDB_VERSION_BOUNDARY,
112 		.sym_num	= SYM_NUM,
113 		.ocon_num	= OCON_NUM - 2,
114 	},
115 	{
116 		.version	= POLICYDB_VERSION_FILENAME_TRANS,
117 		.sym_num	= SYM_NUM,
118 		.ocon_num	= OCON_NUM - 2,
119 	},
120 	{
121 		.version	= POLICYDB_VERSION_ROLETRANS,
122 		.sym_num	= SYM_NUM,
123 		.ocon_num	= OCON_NUM - 2,
124 	},
125 	{
126 		.version	= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS,
127 		.sym_num	= SYM_NUM,
128 		.ocon_num	= OCON_NUM - 2,
129 	},
130 	{
131 		.version	= POLICYDB_VERSION_DEFAULT_TYPE,
132 		.sym_num	= SYM_NUM,
133 		.ocon_num	= OCON_NUM - 2,
134 	},
135 	{
136 		.version	= POLICYDB_VERSION_CONSTRAINT_NAMES,
137 		.sym_num	= SYM_NUM,
138 		.ocon_num	= OCON_NUM - 2,
139 	},
140 	{
141 		.version	= POLICYDB_VERSION_XPERMS_IOCTL,
142 		.sym_num	= SYM_NUM,
143 		.ocon_num	= OCON_NUM - 2,
144 	},
145 	{
146 		.version	= POLICYDB_VERSION_INFINIBAND,
147 		.sym_num	= SYM_NUM,
148 		.ocon_num	= OCON_NUM,
149 	},
150 	{
151 		.version	= POLICYDB_VERSION_GLBLUB,
152 		.sym_num	= SYM_NUM,
153 		.ocon_num	= OCON_NUM,
154 	},
155 	{
156 		.version	= POLICYDB_VERSION_COMP_FTRANS,
157 		.sym_num	= SYM_NUM,
158 		.ocon_num	= OCON_NUM,
159 	},
160 };
161 
162 static const struct policydb_compat_info *policydb_lookup_compat(unsigned int version)
163 {
164 	unsigned int i;
165 
166 	for (i = 0; i < ARRAY_SIZE(policydb_compat); i++) {
167 		if (policydb_compat[i].version == version)
168 			return &policydb_compat[i];
169 	}
170 
171 	return NULL;
172 }
173 
174 /*
175  * The following *_destroy functions are used to
176  * free any memory allocated for each kind of
177  * symbol data in the policy database.
178  */
179 
180 static int perm_destroy(void *key, void *datum, void *p)
181 {
182 	kfree(key);
183 	kfree(datum);
184 	return 0;
185 }
186 
187 static int common_destroy(void *key, void *datum, void *p)
188 {
189 	struct common_datum *comdatum;
190 
191 	kfree(key);
192 	if (datum) {
193 		comdatum = datum;
194 		hashtab_map(&comdatum->permissions.table, perm_destroy, NULL);
195 		hashtab_destroy(&comdatum->permissions.table);
196 	}
197 	kfree(datum);
198 	return 0;
199 }
200 
201 static void constraint_expr_destroy(struct constraint_expr *expr)
202 {
203 	if (expr) {
204 		ebitmap_destroy(&expr->names);
205 		if (expr->type_names) {
206 			ebitmap_destroy(&expr->type_names->types);
207 			ebitmap_destroy(&expr->type_names->negset);
208 			kfree(expr->type_names);
209 		}
210 		kfree(expr);
211 	}
212 }
213 
214 static int cls_destroy(void *key, void *datum, void *p)
215 {
216 	struct class_datum *cladatum;
217 	struct constraint_node *constraint, *ctemp;
218 	struct constraint_expr *e, *etmp;
219 
220 	kfree(key);
221 	if (datum) {
222 		cladatum = datum;
223 		hashtab_map(&cladatum->permissions.table, perm_destroy, NULL);
224 		hashtab_destroy(&cladatum->permissions.table);
225 		constraint = cladatum->constraints;
226 		while (constraint) {
227 			e = constraint->expr;
228 			while (e) {
229 				etmp = e;
230 				e = e->next;
231 				constraint_expr_destroy(etmp);
232 			}
233 			ctemp = constraint;
234 			constraint = constraint->next;
235 			kfree(ctemp);
236 		}
237 
238 		constraint = cladatum->validatetrans;
239 		while (constraint) {
240 			e = constraint->expr;
241 			while (e) {
242 				etmp = e;
243 				e = e->next;
244 				constraint_expr_destroy(etmp);
245 			}
246 			ctemp = constraint;
247 			constraint = constraint->next;
248 			kfree(ctemp);
249 		}
250 		kfree(cladatum->comkey);
251 	}
252 	kfree(datum);
253 	return 0;
254 }
255 
256 static int role_destroy(void *key, void *datum, void *p)
257 {
258 	struct role_datum *role;
259 
260 	kfree(key);
261 	if (datum) {
262 		role = datum;
263 		ebitmap_destroy(&role->dominates);
264 		ebitmap_destroy(&role->types);
265 	}
266 	kfree(datum);
267 	return 0;
268 }
269 
270 static int type_destroy(void *key, void *datum, void *p)
271 {
272 	kfree(key);
273 	kfree(datum);
274 	return 0;
275 }
276 
277 static int user_destroy(void *key, void *datum, void *p)
278 {
279 	struct user_datum *usrdatum;
280 
281 	kfree(key);
282 	if (datum) {
283 		usrdatum = datum;
284 		ebitmap_destroy(&usrdatum->roles);
285 		ebitmap_destroy(&usrdatum->range.level[0].cat);
286 		ebitmap_destroy(&usrdatum->range.level[1].cat);
287 		ebitmap_destroy(&usrdatum->dfltlevel.cat);
288 	}
289 	kfree(datum);
290 	return 0;
291 }
292 
293 static int sens_destroy(void *key, void *datum, void *p)
294 {
295 	struct level_datum *levdatum;
296 
297 	kfree(key);
298 	if (datum) {
299 		levdatum = datum;
300 		if (levdatum->level)
301 			ebitmap_destroy(&levdatum->level->cat);
302 		kfree(levdatum->level);
303 	}
304 	kfree(datum);
305 	return 0;
306 }
307 
308 static int cat_destroy(void *key, void *datum, void *p)
309 {
310 	kfree(key);
311 	kfree(datum);
312 	return 0;
313 }
314 
315 static int (*const destroy_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
316 	common_destroy,
317 	cls_destroy,
318 	role_destroy,
319 	type_destroy,
320 	user_destroy,
321 	cond_destroy_bool,
322 	sens_destroy,
323 	cat_destroy,
324 };
325 
326 static int filenametr_destroy(void *key, void *datum, void *p)
327 {
328 	struct filename_trans_key *ft = key;
329 	struct filename_trans_datum *next, *d = datum;
330 
331 	kfree(ft->name);
332 	kfree(key);
333 	do {
334 		ebitmap_destroy(&d->stypes);
335 		next = d->next;
336 		kfree(d);
337 		d = next;
338 	} while (unlikely(d));
339 	cond_resched();
340 	return 0;
341 }
342 
343 static int range_tr_destroy(void *key, void *datum, void *p)
344 {
345 	struct mls_range *rt = datum;
346 
347 	kfree(key);
348 	ebitmap_destroy(&rt->level[0].cat);
349 	ebitmap_destroy(&rt->level[1].cat);
350 	kfree(datum);
351 	cond_resched();
352 	return 0;
353 }
354 
355 static int role_tr_destroy(void *key, void *datum, void *p)
356 {
357 	kfree(key);
358 	kfree(datum);
359 	return 0;
360 }
361 
362 static void ocontext_destroy(struct ocontext *c, unsigned int i)
363 {
364 	if (!c)
365 		return;
366 
367 	context_destroy(&c->context[0]);
368 	context_destroy(&c->context[1]);
369 	if (i == OCON_ISID || i == OCON_FS ||
370 	    i == OCON_NETIF || i == OCON_FSUSE)
371 		kfree(c->u.name);
372 	kfree(c);
373 }
374 
375 /*
376  * Initialize the role table.
377  */
378 static int roles_init(struct policydb *p)
379 {
380 	char *key = NULL;
381 	int rc;
382 	struct role_datum *role;
383 
384 	role = kzalloc(sizeof(*role), GFP_KERNEL);
385 	if (!role)
386 		return -ENOMEM;
387 
388 	rc = -EINVAL;
389 	role->value = ++p->p_roles.nprim;
390 	if (role->value != OBJECT_R_VAL)
391 		goto out;
392 
393 	rc = -ENOMEM;
394 	key = kstrdup(OBJECT_R, GFP_KERNEL);
395 	if (!key)
396 		goto out;
397 
398 	rc = symtab_insert(&p->p_roles, key, role);
399 	if (rc)
400 		goto out;
401 
402 	return 0;
403 out:
404 	kfree(key);
405 	kfree(role);
406 	return rc;
407 }
408 
409 static u32 filenametr_hash(const void *k)
410 {
411 	const struct filename_trans_key *ft = k;
412 	unsigned long salt = ft->ttype ^ ft->tclass;
413 
414 	return full_name_hash((void *)salt, ft->name, strlen(ft->name));
415 }
416 
417 static int filenametr_cmp(const void *k1, const void *k2)
418 {
419 	const struct filename_trans_key *ft1 = k1;
420 	const struct filename_trans_key *ft2 = k2;
421 	int v;
422 
423 	v = ft1->ttype - ft2->ttype;
424 	if (v)
425 		return v;
426 
427 	v = ft1->tclass - ft2->tclass;
428 	if (v)
429 		return v;
430 
431 	return strcmp(ft1->name, ft2->name);
432 
433 }
434 
435 static const struct hashtab_key_params filenametr_key_params = {
436 	.hash = filenametr_hash,
437 	.cmp = filenametr_cmp,
438 };
439 
440 struct filename_trans_datum *policydb_filenametr_search(
441 	struct policydb *p, struct filename_trans_key *key)
442 {
443 	return hashtab_search(&p->filename_trans, key, filenametr_key_params);
444 }
445 
446 static u32 rangetr_hash(const void *k)
447 {
448 	const struct range_trans *key = k;
449 
450 	return key->source_type + (key->target_type << 3) +
451 		(key->target_class << 5);
452 }
453 
454 static int rangetr_cmp(const void *k1, const void *k2)
455 {
456 	const struct range_trans *key1 = k1, *key2 = k2;
457 	int v;
458 
459 	v = key1->source_type - key2->source_type;
460 	if (v)
461 		return v;
462 
463 	v = key1->target_type - key2->target_type;
464 	if (v)
465 		return v;
466 
467 	v = key1->target_class - key2->target_class;
468 
469 	return v;
470 }
471 
472 static const struct hashtab_key_params rangetr_key_params = {
473 	.hash = rangetr_hash,
474 	.cmp = rangetr_cmp,
475 };
476 
477 struct mls_range *policydb_rangetr_search(struct policydb *p,
478 					  struct range_trans *key)
479 {
480 	return hashtab_search(&p->range_tr, key, rangetr_key_params);
481 }
482 
483 static u32 role_trans_hash(const void *k)
484 {
485 	const struct role_trans_key *key = k;
486 
487 	return jhash_3words(key->role, key->type, (u32)key->tclass << 16 | key->tclass, 0);
488 }
489 
490 static int role_trans_cmp(const void *k1, const void *k2)
491 {
492 	const struct role_trans_key *key1 = k1, *key2 = k2;
493 	int v;
494 
495 	v = key1->role - key2->role;
496 	if (v)
497 		return v;
498 
499 	v = key1->type - key2->type;
500 	if (v)
501 		return v;
502 
503 	return key1->tclass - key2->tclass;
504 }
505 
506 static const struct hashtab_key_params roletr_key_params = {
507 	.hash = role_trans_hash,
508 	.cmp = role_trans_cmp,
509 };
510 
511 struct role_trans_datum *policydb_roletr_search(struct policydb *p,
512 						struct role_trans_key *key)
513 {
514 	return hashtab_search(&p->role_tr, key, roletr_key_params);
515 }
516 
517 /*
518  * Initialize a policy database structure.
519  */
520 static void policydb_init(struct policydb *p)
521 {
522 	memset(p, 0, sizeof(*p));
523 
524 	avtab_init(&p->te_avtab);
525 	cond_policydb_init(p);
526 
527 	ebitmap_init(&p->filename_trans_ttypes);
528 	ebitmap_init(&p->policycaps);
529 	ebitmap_init(&p->permissive_map);
530 }
531 
532 /*
533  * The following *_index functions are used to
534  * define the val_to_name and val_to_struct arrays
535  * in a policy database structure.  The val_to_name
536  * arrays are used when converting security context
537  * structures into string representations.  The
538  * val_to_struct arrays are used when the attributes
539  * of a class, role, or user are needed.
540  */
541 
542 static int common_index(void *key, void *datum, void *datap)
543 {
544 	struct policydb *p;
545 	struct common_datum *comdatum;
546 
547 	comdatum = datum;
548 	p = datap;
549 	if (!comdatum->value || comdatum->value > p->p_commons.nprim)
550 		return -EINVAL;
551 
552 	p->sym_val_to_name[SYM_COMMONS][comdatum->value - 1] = key;
553 
554 	return 0;
555 }
556 
557 static int class_index(void *key, void *datum, void *datap)
558 {
559 	struct policydb *p;
560 	struct class_datum *cladatum;
561 
562 	cladatum = datum;
563 	p = datap;
564 	if (!cladatum->value || cladatum->value > p->p_classes.nprim)
565 		return -EINVAL;
566 
567 	p->sym_val_to_name[SYM_CLASSES][cladatum->value - 1] = key;
568 	p->class_val_to_struct[cladatum->value - 1] = cladatum;
569 	return 0;
570 }
571 
572 static int role_index(void *key, void *datum, void *datap)
573 {
574 	struct policydb *p;
575 	struct role_datum *role;
576 
577 	role = datum;
578 	p = datap;
579 	if (!role->value
580 	    || role->value > p->p_roles.nprim
581 	    || role->bounds > p->p_roles.nprim)
582 		return -EINVAL;
583 
584 	p->sym_val_to_name[SYM_ROLES][role->value - 1] = key;
585 	p->role_val_to_struct[role->value - 1] = role;
586 	return 0;
587 }
588 
589 static int type_index(void *key, void *datum, void *datap)
590 {
591 	struct policydb *p;
592 	struct type_datum *typdatum;
593 
594 	typdatum = datum;
595 	p = datap;
596 
597 	if (typdatum->primary) {
598 		if (!typdatum->value
599 		    || typdatum->value > p->p_types.nprim
600 		    || typdatum->bounds > p->p_types.nprim)
601 			return -EINVAL;
602 		p->sym_val_to_name[SYM_TYPES][typdatum->value - 1] = key;
603 		p->type_val_to_struct[typdatum->value - 1] = typdatum;
604 	}
605 
606 	return 0;
607 }
608 
609 static int user_index(void *key, void *datum, void *datap)
610 {
611 	struct policydb *p;
612 	struct user_datum *usrdatum;
613 
614 	usrdatum = datum;
615 	p = datap;
616 	if (!usrdatum->value
617 	    || usrdatum->value > p->p_users.nprim
618 	    || usrdatum->bounds > p->p_users.nprim)
619 		return -EINVAL;
620 
621 	p->sym_val_to_name[SYM_USERS][usrdatum->value - 1] = key;
622 	p->user_val_to_struct[usrdatum->value - 1] = usrdatum;
623 	return 0;
624 }
625 
626 static int sens_index(void *key, void *datum, void *datap)
627 {
628 	struct policydb *p;
629 	struct level_datum *levdatum;
630 
631 	levdatum = datum;
632 	p = datap;
633 
634 	if (!levdatum->isalias) {
635 		if (!levdatum->level->sens ||
636 		    levdatum->level->sens > p->p_levels.nprim)
637 			return -EINVAL;
638 
639 		p->sym_val_to_name[SYM_LEVELS][levdatum->level->sens - 1] = key;
640 	}
641 
642 	return 0;
643 }
644 
645 static int cat_index(void *key, void *datum, void *datap)
646 {
647 	struct policydb *p;
648 	struct cat_datum *catdatum;
649 
650 	catdatum = datum;
651 	p = datap;
652 
653 	if (!catdatum->isalias) {
654 		if (!catdatum->value || catdatum->value > p->p_cats.nprim)
655 			return -EINVAL;
656 
657 		p->sym_val_to_name[SYM_CATS][catdatum->value - 1] = key;
658 	}
659 
660 	return 0;
661 }
662 
663 static int (*const index_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
664 	common_index,
665 	class_index,
666 	role_index,
667 	type_index,
668 	user_index,
669 	cond_index_bool,
670 	sens_index,
671 	cat_index,
672 };
673 
674 #ifdef CONFIG_SECURITY_SELINUX_DEBUG
675 static void hash_eval(struct hashtab *h, const char *hash_name)
676 {
677 	struct hashtab_info info;
678 
679 	hashtab_stat(h, &info);
680 	pr_debug("SELinux: %s:  %d entries and %d/%d buckets used, longest chain length %d, sum of chain length^2 %llu\n",
681 		 hash_name, h->nel, info.slots_used, h->size,
682 		 info.max_chain_len, info.chain2_len_sum);
683 }
684 
685 static void symtab_hash_eval(struct symtab *s)
686 {
687 	int i;
688 
689 	for (i = 0; i < SYM_NUM; i++)
690 		hash_eval(&s[i].table, symtab_name[i]);
691 }
692 
693 #else
694 static inline void hash_eval(struct hashtab *h, const char *hash_name)
695 {
696 }
697 static inline void symtab_hash_eval(struct symtab *s)
698 {
699 }
700 #endif /* CONFIG_SECURITY_SELINUX_DEBUG */
701 
702 /*
703  * Define the other val_to_name and val_to_struct arrays
704  * in a policy database structure.
705  *
706  * Caller must clean up on failure.
707  */
708 static int policydb_index(struct policydb *p)
709 {
710 	int i, rc;
711 
712 	if (p->mls_enabled)
713 		pr_debug("SELinux:  %d users, %d roles, %d types, %d bools, %d sens, %d cats\n",
714 			 p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim,
715 			 p->p_bools.nprim, p->p_levels.nprim, p->p_cats.nprim);
716 	else
717 		pr_debug("SELinux:  %d users, %d roles, %d types, %d bools\n",
718 			 p->p_users.nprim, p->p_roles.nprim, p->p_types.nprim,
719 			 p->p_bools.nprim);
720 
721 	pr_debug("SELinux:  %d classes, %d rules\n",
722 		 p->p_classes.nprim, p->te_avtab.nel);
723 
724 	avtab_hash_eval(&p->te_avtab, "rules");
725 	symtab_hash_eval(p->symtab);
726 
727 	p->class_val_to_struct = kcalloc(p->p_classes.nprim,
728 					 sizeof(*p->class_val_to_struct),
729 					 GFP_KERNEL);
730 	if (!p->class_val_to_struct)
731 		return -ENOMEM;
732 
733 	p->role_val_to_struct = kcalloc(p->p_roles.nprim,
734 					sizeof(*p->role_val_to_struct),
735 					GFP_KERNEL);
736 	if (!p->role_val_to_struct)
737 		return -ENOMEM;
738 
739 	p->user_val_to_struct = kcalloc(p->p_users.nprim,
740 					sizeof(*p->user_val_to_struct),
741 					GFP_KERNEL);
742 	if (!p->user_val_to_struct)
743 		return -ENOMEM;
744 
745 	p->type_val_to_struct = kvcalloc(p->p_types.nprim,
746 					 sizeof(*p->type_val_to_struct),
747 					 GFP_KERNEL);
748 	if (!p->type_val_to_struct)
749 		return -ENOMEM;
750 
751 	rc = cond_init_bool_indexes(p);
752 	if (rc)
753 		goto out;
754 
755 	for (i = 0; i < SYM_NUM; i++) {
756 		p->sym_val_to_name[i] = kvcalloc(p->symtab[i].nprim,
757 						 sizeof(char *),
758 						 GFP_KERNEL);
759 		if (!p->sym_val_to_name[i])
760 			return -ENOMEM;
761 
762 		rc = hashtab_map(&p->symtab[i].table, index_f[i], p);
763 		if (rc)
764 			goto out;
765 	}
766 	rc = 0;
767 out:
768 	return rc;
769 }
770 
771 /*
772  * Free any memory allocated by a policy database structure.
773  */
774 void policydb_destroy(struct policydb *p)
775 {
776 	struct ocontext *c, *ctmp;
777 	struct genfs *g, *gtmp;
778 	u32 i;
779 	struct role_allow *ra, *lra = NULL;
780 
781 	for (i = 0; i < SYM_NUM; i++) {
782 		cond_resched();
783 		hashtab_map(&p->symtab[i].table, destroy_f[i], NULL);
784 		hashtab_destroy(&p->symtab[i].table);
785 	}
786 
787 	for (i = 0; i < SYM_NUM; i++)
788 		kvfree(p->sym_val_to_name[i]);
789 
790 	kfree(p->class_val_to_struct);
791 	kfree(p->role_val_to_struct);
792 	kfree(p->user_val_to_struct);
793 	kvfree(p->type_val_to_struct);
794 
795 	avtab_destroy(&p->te_avtab);
796 
797 	for (i = 0; i < OCON_NUM; i++) {
798 		cond_resched();
799 		c = p->ocontexts[i];
800 		while (c) {
801 			ctmp = c;
802 			c = c->next;
803 			ocontext_destroy(ctmp, i);
804 		}
805 		p->ocontexts[i] = NULL;
806 	}
807 
808 	g = p->genfs;
809 	while (g) {
810 		cond_resched();
811 		kfree(g->fstype);
812 		c = g->head;
813 		while (c) {
814 			ctmp = c;
815 			c = c->next;
816 			ocontext_destroy(ctmp, OCON_FSUSE);
817 		}
818 		gtmp = g;
819 		g = g->next;
820 		kfree(gtmp);
821 	}
822 	p->genfs = NULL;
823 
824 	cond_policydb_destroy(p);
825 
826 	hashtab_map(&p->role_tr, role_tr_destroy, NULL);
827 	hashtab_destroy(&p->role_tr);
828 
829 	for (ra = p->role_allow; ra; ra = ra->next) {
830 		cond_resched();
831 		kfree(lra);
832 		lra = ra;
833 	}
834 	kfree(lra);
835 
836 	hashtab_map(&p->filename_trans, filenametr_destroy, NULL);
837 	hashtab_destroy(&p->filename_trans);
838 
839 	hashtab_map(&p->range_tr, range_tr_destroy, NULL);
840 	hashtab_destroy(&p->range_tr);
841 
842 	if (p->type_attr_map_array) {
843 		for (i = 0; i < p->p_types.nprim; i++)
844 			ebitmap_destroy(&p->type_attr_map_array[i]);
845 		kvfree(p->type_attr_map_array);
846 	}
847 
848 	ebitmap_destroy(&p->filename_trans_ttypes);
849 	ebitmap_destroy(&p->policycaps);
850 	ebitmap_destroy(&p->permissive_map);
851 }
852 
853 /*
854  * Load the initial SIDs specified in a policy database
855  * structure into a SID table.
856  */
857 int policydb_load_isids(struct policydb *p, struct sidtab *s)
858 {
859 	struct ocontext *head, *c;
860 	bool isid_init_supported = ebitmap_get_bit(&p->policycaps,
861 						   POLICYDB_CAP_USERSPACE_INITIAL_CONTEXT);
862 	int rc;
863 
864 	rc = sidtab_init(s);
865 	if (rc) {
866 		pr_err("SELinux:  out of memory on SID table init\n");
867 		return rc;
868 	}
869 
870 	head = p->ocontexts[OCON_ISID];
871 	for (c = head; c; c = c->next) {
872 		u32 sid = c->sid[0];
873 		const char *name = security_get_initial_sid_context(sid);
874 
875 		if (sid == SECSID_NULL) {
876 			pr_err("SELinux:  SID 0 was assigned a context.\n");
877 			sidtab_destroy(s);
878 			return -EINVAL;
879 		}
880 
881 		/* Ignore initial SIDs unused by this kernel. */
882 		if (!name)
883 			continue;
884 
885 		/*
886 		 * Also ignore SECINITSID_INIT if the policy doesn't declare
887 		 * support for it
888 		 */
889 		if (sid == SECINITSID_INIT && !isid_init_supported)
890 			continue;
891 
892 		rc = sidtab_set_initial(s, sid, &c->context[0]);
893 		if (rc) {
894 			pr_err("SELinux:  unable to load initial SID %s.\n",
895 			       name);
896 			sidtab_destroy(s);
897 			return rc;
898 		}
899 
900 		/*
901 		 * If the policy doesn't support the "userspace_initial_context"
902 		 * capability, set SECINITSID_INIT to the same context as
903 		 * SECINITSID_KERNEL. This ensures the same behavior as before
904 		 * the reintroduction of SECINITSID_INIT, where all tasks
905 		 * started before policy load would initially get the context
906 		 * corresponding to SECINITSID_KERNEL.
907 		 */
908 		if (sid == SECINITSID_KERNEL && !isid_init_supported) {
909 			rc = sidtab_set_initial(s, SECINITSID_INIT, &c->context[0]);
910 			if (rc) {
911 				pr_err("SELinux:  unable to load initial SID %s.\n",
912 				       name);
913 				sidtab_destroy(s);
914 				return rc;
915 			}
916 		}
917 	}
918 	return 0;
919 }
920 
921 int policydb_class_isvalid(struct policydb *p, unsigned int class)
922 {
923 	if (!class || class > p->p_classes.nprim)
924 		return 0;
925 	return 1;
926 }
927 
928 int policydb_role_isvalid(struct policydb *p, unsigned int role)
929 {
930 	if (!role || role > p->p_roles.nprim)
931 		return 0;
932 	return 1;
933 }
934 
935 int policydb_type_isvalid(struct policydb *p, unsigned int type)
936 {
937 	if (!type || type > p->p_types.nprim)
938 		return 0;
939 	return 1;
940 }
941 
942 /*
943  * Return 1 if the fields in the security context
944  * structure `c' are valid.  Return 0 otherwise.
945  */
946 int policydb_context_isvalid(struct policydb *p, struct context *c)
947 {
948 	struct role_datum *role;
949 	struct user_datum *usrdatum;
950 
951 	if (!c->role || c->role > p->p_roles.nprim)
952 		return 0;
953 
954 	if (!c->user || c->user > p->p_users.nprim)
955 		return 0;
956 
957 	if (!c->type || c->type > p->p_types.nprim)
958 		return 0;
959 
960 	if (c->role != OBJECT_R_VAL) {
961 		/*
962 		 * Role must be authorized for the type.
963 		 */
964 		role = p->role_val_to_struct[c->role - 1];
965 		if (!role || !ebitmap_get_bit(&role->types, c->type - 1))
966 			/* role may not be associated with type */
967 			return 0;
968 
969 		/*
970 		 * User must be authorized for the role.
971 		 */
972 		usrdatum = p->user_val_to_struct[c->user - 1];
973 		if (!usrdatum)
974 			return 0;
975 
976 		if (!ebitmap_get_bit(&usrdatum->roles, c->role - 1))
977 			/* user may not be associated with role */
978 			return 0;
979 	}
980 
981 	if (!mls_context_isvalid(p, c))
982 		return 0;
983 
984 	return 1;
985 }
986 
987 /*
988  * Read a MLS range structure from a policydb binary
989  * representation file.
990  */
991 static int mls_read_range_helper(struct mls_range *r, void *fp)
992 {
993 	__le32 buf[2];
994 	u32 items;
995 	int rc;
996 
997 	rc = next_entry(buf, fp, sizeof(u32));
998 	if (rc)
999 		goto out;
1000 
1001 	rc = -EINVAL;
1002 	items = le32_to_cpu(buf[0]);
1003 	if (items > ARRAY_SIZE(buf)) {
1004 		pr_err("SELinux: mls:  range overflow\n");
1005 		goto out;
1006 	}
1007 
1008 	rc = next_entry(buf, fp, sizeof(u32) * items);
1009 	if (rc) {
1010 		pr_err("SELinux: mls:  truncated range\n");
1011 		goto out;
1012 	}
1013 
1014 	r->level[0].sens = le32_to_cpu(buf[0]);
1015 	if (items > 1)
1016 		r->level[1].sens = le32_to_cpu(buf[1]);
1017 	else
1018 		r->level[1].sens = r->level[0].sens;
1019 
1020 	rc = ebitmap_read(&r->level[0].cat, fp);
1021 	if (rc) {
1022 		pr_err("SELinux: mls:  error reading low categories\n");
1023 		goto out;
1024 	}
1025 	if (items > 1) {
1026 		rc = ebitmap_read(&r->level[1].cat, fp);
1027 		if (rc) {
1028 			pr_err("SELinux: mls:  error reading high categories\n");
1029 			goto bad_high;
1030 		}
1031 	} else {
1032 		rc = ebitmap_cpy(&r->level[1].cat, &r->level[0].cat);
1033 		if (rc) {
1034 			pr_err("SELinux: mls:  out of memory\n");
1035 			goto bad_high;
1036 		}
1037 	}
1038 
1039 	return 0;
1040 bad_high:
1041 	ebitmap_destroy(&r->level[0].cat);
1042 out:
1043 	return rc;
1044 }
1045 
1046 /*
1047  * Read and validate a security context structure
1048  * from a policydb binary representation file.
1049  */
1050 static int context_read_and_validate(struct context *c,
1051 				     struct policydb *p,
1052 				     void *fp)
1053 {
1054 	__le32 buf[3];
1055 	int rc;
1056 
1057 	rc = next_entry(buf, fp, sizeof buf);
1058 	if (rc) {
1059 		pr_err("SELinux: context truncated\n");
1060 		goto out;
1061 	}
1062 	c->user = le32_to_cpu(buf[0]);
1063 	c->role = le32_to_cpu(buf[1]);
1064 	c->type = le32_to_cpu(buf[2]);
1065 	if (p->policyvers >= POLICYDB_VERSION_MLS) {
1066 		rc = mls_read_range_helper(&c->range, fp);
1067 		if (rc) {
1068 			pr_err("SELinux: error reading MLS range of context\n");
1069 			goto out;
1070 		}
1071 	}
1072 
1073 	rc = -EINVAL;
1074 	if (!policydb_context_isvalid(p, c)) {
1075 		pr_err("SELinux:  invalid security context\n");
1076 		context_destroy(c);
1077 		goto out;
1078 	}
1079 	rc = 0;
1080 out:
1081 	return rc;
1082 }
1083 
1084 /*
1085  * The following *_read functions are used to
1086  * read the symbol data from a policy database
1087  * binary representation file.
1088  */
1089 
1090 static int str_read(char **strp, gfp_t flags, void *fp, u32 len)
1091 {
1092 	int rc;
1093 	char *str;
1094 
1095 	if ((len == 0) || (len == (u32)-1))
1096 		return -EINVAL;
1097 
1098 	str = kmalloc(len + 1, flags | __GFP_NOWARN);
1099 	if (!str)
1100 		return -ENOMEM;
1101 
1102 	rc = next_entry(str, fp, len);
1103 	if (rc) {
1104 		kfree(str);
1105 		return rc;
1106 	}
1107 
1108 	str[len] = '\0';
1109 	*strp = str;
1110 	return 0;
1111 }
1112 
1113 static int perm_read(struct policydb *p, struct symtab *s, void *fp)
1114 {
1115 	char *key = NULL;
1116 	struct perm_datum *perdatum;
1117 	int rc;
1118 	__le32 buf[2];
1119 	u32 len;
1120 
1121 	perdatum = kzalloc(sizeof(*perdatum), GFP_KERNEL);
1122 	if (!perdatum)
1123 		return -ENOMEM;
1124 
1125 	rc = next_entry(buf, fp, sizeof buf);
1126 	if (rc)
1127 		goto bad;
1128 
1129 	len = le32_to_cpu(buf[0]);
1130 	perdatum->value = le32_to_cpu(buf[1]);
1131 
1132 	rc = str_read(&key, GFP_KERNEL, fp, len);
1133 	if (rc)
1134 		goto bad;
1135 
1136 	rc = symtab_insert(s, key, perdatum);
1137 	if (rc)
1138 		goto bad;
1139 
1140 	return 0;
1141 bad:
1142 	perm_destroy(key, perdatum, NULL);
1143 	return rc;
1144 }
1145 
1146 static int common_read(struct policydb *p, struct symtab *s, void *fp)
1147 {
1148 	char *key = NULL;
1149 	struct common_datum *comdatum;
1150 	__le32 buf[4];
1151 	u32 i, len, nel;
1152 	int rc;
1153 
1154 	comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL);
1155 	if (!comdatum)
1156 		return -ENOMEM;
1157 
1158 	rc = next_entry(buf, fp, sizeof buf);
1159 	if (rc)
1160 		goto bad;
1161 
1162 	len = le32_to_cpu(buf[0]);
1163 	comdatum->value = le32_to_cpu(buf[1]);
1164 	nel = le32_to_cpu(buf[3]);
1165 
1166 	rc = symtab_init(&comdatum->permissions, nel);
1167 	if (rc)
1168 		goto bad;
1169 	comdatum->permissions.nprim = le32_to_cpu(buf[2]);
1170 
1171 	rc = str_read(&key, GFP_KERNEL, fp, len);
1172 	if (rc)
1173 		goto bad;
1174 
1175 	for (i = 0; i < nel; i++) {
1176 		rc = perm_read(p, &comdatum->permissions, fp);
1177 		if (rc)
1178 			goto bad;
1179 	}
1180 
1181 	rc = symtab_insert(s, key, comdatum);
1182 	if (rc)
1183 		goto bad;
1184 	return 0;
1185 bad:
1186 	common_destroy(key, comdatum, NULL);
1187 	return rc;
1188 }
1189 
1190 static void type_set_init(struct type_set *t)
1191 {
1192 	ebitmap_init(&t->types);
1193 	ebitmap_init(&t->negset);
1194 }
1195 
1196 static int type_set_read(struct type_set *t, void *fp)
1197 {
1198 	__le32 buf[1];
1199 	int rc;
1200 
1201 	if (ebitmap_read(&t->types, fp))
1202 		return -EINVAL;
1203 	if (ebitmap_read(&t->negset, fp))
1204 		return -EINVAL;
1205 
1206 	rc = next_entry(buf, fp, sizeof(u32));
1207 	if (rc < 0)
1208 		return -EINVAL;
1209 	t->flags = le32_to_cpu(buf[0]);
1210 
1211 	return 0;
1212 }
1213 
1214 
1215 static int read_cons_helper(struct policydb *p,
1216 				struct constraint_node **nodep,
1217 				u32 ncons, int allowxtarget, void *fp)
1218 {
1219 	struct constraint_node *c, *lc;
1220 	struct constraint_expr *e, *le;
1221 	__le32 buf[3];
1222 	u32 i, j, nexpr;
1223 	int rc, depth;
1224 
1225 	lc = NULL;
1226 	for (i = 0; i < ncons; i++) {
1227 		c = kzalloc(sizeof(*c), GFP_KERNEL);
1228 		if (!c)
1229 			return -ENOMEM;
1230 
1231 		if (lc)
1232 			lc->next = c;
1233 		else
1234 			*nodep = c;
1235 
1236 		rc = next_entry(buf, fp, (sizeof(u32) * 2));
1237 		if (rc)
1238 			return rc;
1239 		c->permissions = le32_to_cpu(buf[0]);
1240 		nexpr = le32_to_cpu(buf[1]);
1241 		le = NULL;
1242 		depth = -1;
1243 		for (j = 0; j < nexpr; j++) {
1244 			e = kzalloc(sizeof(*e), GFP_KERNEL);
1245 			if (!e)
1246 				return -ENOMEM;
1247 
1248 			if (le)
1249 				le->next = e;
1250 			else
1251 				c->expr = e;
1252 
1253 			rc = next_entry(buf, fp, (sizeof(u32) * 3));
1254 			if (rc)
1255 				return rc;
1256 			e->expr_type = le32_to_cpu(buf[0]);
1257 			e->attr = le32_to_cpu(buf[1]);
1258 			e->op = le32_to_cpu(buf[2]);
1259 
1260 			switch (e->expr_type) {
1261 			case CEXPR_NOT:
1262 				if (depth < 0)
1263 					return -EINVAL;
1264 				break;
1265 			case CEXPR_AND:
1266 			case CEXPR_OR:
1267 				if (depth < 1)
1268 					return -EINVAL;
1269 				depth--;
1270 				break;
1271 			case CEXPR_ATTR:
1272 				if (depth == (CEXPR_MAXDEPTH - 1))
1273 					return -EINVAL;
1274 				depth++;
1275 				break;
1276 			case CEXPR_NAMES:
1277 				if (!allowxtarget && (e->attr & CEXPR_XTARGET))
1278 					return -EINVAL;
1279 				if (depth == (CEXPR_MAXDEPTH - 1))
1280 					return -EINVAL;
1281 				depth++;
1282 				rc = ebitmap_read(&e->names, fp);
1283 				if (rc)
1284 					return rc;
1285 				if (p->policyvers >=
1286 				    POLICYDB_VERSION_CONSTRAINT_NAMES) {
1287 					e->type_names = kzalloc(sizeof
1288 						(*e->type_names), GFP_KERNEL);
1289 					if (!e->type_names)
1290 						return -ENOMEM;
1291 					type_set_init(e->type_names);
1292 					rc = type_set_read(e->type_names, fp);
1293 					if (rc)
1294 						return rc;
1295 				}
1296 				break;
1297 			default:
1298 				return -EINVAL;
1299 			}
1300 			le = e;
1301 		}
1302 		if (depth != 0)
1303 			return -EINVAL;
1304 		lc = c;
1305 	}
1306 
1307 	return 0;
1308 }
1309 
1310 static int class_read(struct policydb *p, struct symtab *s, void *fp)
1311 {
1312 	char *key = NULL;
1313 	struct class_datum *cladatum;
1314 	__le32 buf[6];
1315 	u32 i, len, len2, ncons, nel;
1316 	int rc;
1317 
1318 	cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL);
1319 	if (!cladatum)
1320 		return -ENOMEM;
1321 
1322 	rc = next_entry(buf, fp, sizeof(u32)*6);
1323 	if (rc)
1324 		goto bad;
1325 
1326 	len = le32_to_cpu(buf[0]);
1327 	len2 = le32_to_cpu(buf[1]);
1328 	cladatum->value = le32_to_cpu(buf[2]);
1329 	nel = le32_to_cpu(buf[4]);
1330 
1331 	rc = symtab_init(&cladatum->permissions, nel);
1332 	if (rc)
1333 		goto bad;
1334 	cladatum->permissions.nprim = le32_to_cpu(buf[3]);
1335 
1336 	ncons = le32_to_cpu(buf[5]);
1337 
1338 	rc = str_read(&key, GFP_KERNEL, fp, len);
1339 	if (rc)
1340 		goto bad;
1341 
1342 	if (len2) {
1343 		rc = str_read(&cladatum->comkey, GFP_KERNEL, fp, len2);
1344 		if (rc)
1345 			goto bad;
1346 
1347 		rc = -EINVAL;
1348 		cladatum->comdatum = symtab_search(&p->p_commons,
1349 						   cladatum->comkey);
1350 		if (!cladatum->comdatum) {
1351 			pr_err("SELinux:  unknown common %s\n",
1352 			       cladatum->comkey);
1353 			goto bad;
1354 		}
1355 	}
1356 	for (i = 0; i < nel; i++) {
1357 		rc = perm_read(p, &cladatum->permissions, fp);
1358 		if (rc)
1359 			goto bad;
1360 	}
1361 
1362 	rc = read_cons_helper(p, &cladatum->constraints, ncons, 0, fp);
1363 	if (rc)
1364 		goto bad;
1365 
1366 	if (p->policyvers >= POLICYDB_VERSION_VALIDATETRANS) {
1367 		/* grab the validatetrans rules */
1368 		rc = next_entry(buf, fp, sizeof(u32));
1369 		if (rc)
1370 			goto bad;
1371 		ncons = le32_to_cpu(buf[0]);
1372 		rc = read_cons_helper(p, &cladatum->validatetrans,
1373 				ncons, 1, fp);
1374 		if (rc)
1375 			goto bad;
1376 	}
1377 
1378 	if (p->policyvers >= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS) {
1379 		rc = next_entry(buf, fp, sizeof(u32) * 3);
1380 		if (rc)
1381 			goto bad;
1382 
1383 		cladatum->default_user = le32_to_cpu(buf[0]);
1384 		cladatum->default_role = le32_to_cpu(buf[1]);
1385 		cladatum->default_range = le32_to_cpu(buf[2]);
1386 	}
1387 
1388 	if (p->policyvers >= POLICYDB_VERSION_DEFAULT_TYPE) {
1389 		rc = next_entry(buf, fp, sizeof(u32) * 1);
1390 		if (rc)
1391 			goto bad;
1392 		cladatum->default_type = le32_to_cpu(buf[0]);
1393 	}
1394 
1395 	rc = symtab_insert(s, key, cladatum);
1396 	if (rc)
1397 		goto bad;
1398 
1399 	return 0;
1400 bad:
1401 	cls_destroy(key, cladatum, NULL);
1402 	return rc;
1403 }
1404 
1405 static int role_read(struct policydb *p, struct symtab *s, void *fp)
1406 {
1407 	char *key = NULL;
1408 	struct role_datum *role;
1409 	int rc;
1410 	unsigned int to_read = 2;
1411 	__le32 buf[3];
1412 	u32 len;
1413 
1414 	role = kzalloc(sizeof(*role), GFP_KERNEL);
1415 	if (!role)
1416 		return -ENOMEM;
1417 
1418 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1419 		to_read = 3;
1420 
1421 	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1422 	if (rc)
1423 		goto bad;
1424 
1425 	len = le32_to_cpu(buf[0]);
1426 	role->value = le32_to_cpu(buf[1]);
1427 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1428 		role->bounds = le32_to_cpu(buf[2]);
1429 
1430 	rc = str_read(&key, GFP_KERNEL, fp, len);
1431 	if (rc)
1432 		goto bad;
1433 
1434 	rc = ebitmap_read(&role->dominates, fp);
1435 	if (rc)
1436 		goto bad;
1437 
1438 	rc = ebitmap_read(&role->types, fp);
1439 	if (rc)
1440 		goto bad;
1441 
1442 	if (strcmp(key, OBJECT_R) == 0) {
1443 		rc = -EINVAL;
1444 		if (role->value != OBJECT_R_VAL) {
1445 			pr_err("SELinux: Role %s has wrong value %d\n",
1446 			       OBJECT_R, role->value);
1447 			goto bad;
1448 		}
1449 		rc = 0;
1450 		goto bad;
1451 	}
1452 
1453 	rc = symtab_insert(s, key, role);
1454 	if (rc)
1455 		goto bad;
1456 	return 0;
1457 bad:
1458 	role_destroy(key, role, NULL);
1459 	return rc;
1460 }
1461 
1462 static int type_read(struct policydb *p, struct symtab *s, void *fp)
1463 {
1464 	char *key = NULL;
1465 	struct type_datum *typdatum;
1466 	int rc;
1467 	unsigned int to_read = 3;
1468 	__le32 buf[4];
1469 	u32 len;
1470 
1471 	typdatum = kzalloc(sizeof(*typdatum), GFP_KERNEL);
1472 	if (!typdatum)
1473 		return -ENOMEM;
1474 
1475 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1476 		to_read = 4;
1477 
1478 	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1479 	if (rc)
1480 		goto bad;
1481 
1482 	len = le32_to_cpu(buf[0]);
1483 	typdatum->value = le32_to_cpu(buf[1]);
1484 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) {
1485 		u32 prop = le32_to_cpu(buf[2]);
1486 
1487 		if (prop & TYPEDATUM_PROPERTY_PRIMARY)
1488 			typdatum->primary = 1;
1489 		if (prop & TYPEDATUM_PROPERTY_ATTRIBUTE)
1490 			typdatum->attribute = 1;
1491 
1492 		typdatum->bounds = le32_to_cpu(buf[3]);
1493 	} else {
1494 		typdatum->primary = le32_to_cpu(buf[2]);
1495 	}
1496 
1497 	rc = str_read(&key, GFP_KERNEL, fp, len);
1498 	if (rc)
1499 		goto bad;
1500 
1501 	rc = symtab_insert(s, key, typdatum);
1502 	if (rc)
1503 		goto bad;
1504 	return 0;
1505 bad:
1506 	type_destroy(key, typdatum, NULL);
1507 	return rc;
1508 }
1509 
1510 
1511 /*
1512  * Read a MLS level structure from a policydb binary
1513  * representation file.
1514  */
1515 static int mls_read_level(struct mls_level *lp, void *fp)
1516 {
1517 	__le32 buf[1];
1518 	int rc;
1519 
1520 	memset(lp, 0, sizeof(*lp));
1521 
1522 	rc = next_entry(buf, fp, sizeof buf);
1523 	if (rc) {
1524 		pr_err("SELinux: mls: truncated level\n");
1525 		return rc;
1526 	}
1527 	lp->sens = le32_to_cpu(buf[0]);
1528 
1529 	rc = ebitmap_read(&lp->cat, fp);
1530 	if (rc) {
1531 		pr_err("SELinux: mls:  error reading level categories\n");
1532 		return rc;
1533 	}
1534 	return 0;
1535 }
1536 
1537 static int user_read(struct policydb *p, struct symtab *s, void *fp)
1538 {
1539 	char *key = NULL;
1540 	struct user_datum *usrdatum;
1541 	int rc;
1542 	unsigned int to_read = 2;
1543 	__le32 buf[3];
1544 	u32 len;
1545 
1546 	usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL);
1547 	if (!usrdatum)
1548 		return -ENOMEM;
1549 
1550 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1551 		to_read = 3;
1552 
1553 	rc = next_entry(buf, fp, sizeof(buf[0]) * to_read);
1554 	if (rc)
1555 		goto bad;
1556 
1557 	len = le32_to_cpu(buf[0]);
1558 	usrdatum->value = le32_to_cpu(buf[1]);
1559 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
1560 		usrdatum->bounds = le32_to_cpu(buf[2]);
1561 
1562 	rc = str_read(&key, GFP_KERNEL, fp, len);
1563 	if (rc)
1564 		goto bad;
1565 
1566 	rc = ebitmap_read(&usrdatum->roles, fp);
1567 	if (rc)
1568 		goto bad;
1569 
1570 	if (p->policyvers >= POLICYDB_VERSION_MLS) {
1571 		rc = mls_read_range_helper(&usrdatum->range, fp);
1572 		if (rc)
1573 			goto bad;
1574 		rc = mls_read_level(&usrdatum->dfltlevel, fp);
1575 		if (rc)
1576 			goto bad;
1577 	}
1578 
1579 	rc = symtab_insert(s, key, usrdatum);
1580 	if (rc)
1581 		goto bad;
1582 	return 0;
1583 bad:
1584 	user_destroy(key, usrdatum, NULL);
1585 	return rc;
1586 }
1587 
1588 static int sens_read(struct policydb *p, struct symtab *s, void *fp)
1589 {
1590 	char *key = NULL;
1591 	struct level_datum *levdatum;
1592 	int rc;
1593 	__le32 buf[2];
1594 	u32 len;
1595 
1596 	levdatum = kzalloc(sizeof(*levdatum), GFP_KERNEL);
1597 	if (!levdatum)
1598 		return -ENOMEM;
1599 
1600 	rc = next_entry(buf, fp, sizeof buf);
1601 	if (rc)
1602 		goto bad;
1603 
1604 	len = le32_to_cpu(buf[0]);
1605 	levdatum->isalias = le32_to_cpu(buf[1]);
1606 
1607 	rc = str_read(&key, GFP_KERNEL, fp, len);
1608 	if (rc)
1609 		goto bad;
1610 
1611 	rc = -ENOMEM;
1612 	levdatum->level = kmalloc(sizeof(*levdatum->level), GFP_KERNEL);
1613 	if (!levdatum->level)
1614 		goto bad;
1615 
1616 	rc = mls_read_level(levdatum->level, fp);
1617 	if (rc)
1618 		goto bad;
1619 
1620 	rc = symtab_insert(s, key, levdatum);
1621 	if (rc)
1622 		goto bad;
1623 	return 0;
1624 bad:
1625 	sens_destroy(key, levdatum, NULL);
1626 	return rc;
1627 }
1628 
1629 static int cat_read(struct policydb *p, struct symtab *s, void *fp)
1630 {
1631 	char *key = NULL;
1632 	struct cat_datum *catdatum;
1633 	int rc;
1634 	__le32 buf[3];
1635 	u32 len;
1636 
1637 	catdatum = kzalloc(sizeof(*catdatum), GFP_KERNEL);
1638 	if (!catdatum)
1639 		return -ENOMEM;
1640 
1641 	rc = next_entry(buf, fp, sizeof buf);
1642 	if (rc)
1643 		goto bad;
1644 
1645 	len = le32_to_cpu(buf[0]);
1646 	catdatum->value = le32_to_cpu(buf[1]);
1647 	catdatum->isalias = le32_to_cpu(buf[2]);
1648 
1649 	rc = str_read(&key, GFP_KERNEL, fp, len);
1650 	if (rc)
1651 		goto bad;
1652 
1653 	rc = symtab_insert(s, key, catdatum);
1654 	if (rc)
1655 		goto bad;
1656 	return 0;
1657 bad:
1658 	cat_destroy(key, catdatum, NULL);
1659 	return rc;
1660 }
1661 
1662 static int (*const read_f[SYM_NUM]) (struct policydb *p,
1663 				     struct symtab *s, void *fp) = {
1664 	common_read,
1665 	class_read,
1666 	role_read,
1667 	type_read,
1668 	user_read,
1669 	cond_read_bool,
1670 	sens_read,
1671 	cat_read,
1672 };
1673 
1674 static int user_bounds_sanity_check(void *key, void *datum, void *datap)
1675 {
1676 	struct user_datum *upper, *user;
1677 	struct policydb *p = datap;
1678 	int depth = 0;
1679 
1680 	upper = user = datum;
1681 	while (upper->bounds) {
1682 		struct ebitmap_node *node;
1683 		u32 bit;
1684 
1685 		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1686 			pr_err("SELinux: user %s: "
1687 			       "too deep or looped boundary\n",
1688 			       (char *) key);
1689 			return -EINVAL;
1690 		}
1691 
1692 		upper = p->user_val_to_struct[upper->bounds - 1];
1693 		ebitmap_for_each_positive_bit(&user->roles, node, bit) {
1694 			if (ebitmap_get_bit(&upper->roles, bit))
1695 				continue;
1696 
1697 			pr_err("SELinux: boundary violated policy: "
1698 			       "user=%s role=%s bounds=%s\n",
1699 			       sym_name(p, SYM_USERS, user->value - 1),
1700 			       sym_name(p, SYM_ROLES, bit),
1701 			       sym_name(p, SYM_USERS, upper->value - 1));
1702 
1703 			return -EINVAL;
1704 		}
1705 	}
1706 
1707 	return 0;
1708 }
1709 
1710 static int role_bounds_sanity_check(void *key, void *datum, void *datap)
1711 {
1712 	struct role_datum *upper, *role;
1713 	struct policydb *p = datap;
1714 	int depth = 0;
1715 
1716 	upper = role = datum;
1717 	while (upper->bounds) {
1718 		struct ebitmap_node *node;
1719 		u32 bit;
1720 
1721 		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1722 			pr_err("SELinux: role %s: "
1723 			       "too deep or looped bounds\n",
1724 			       (char *) key);
1725 			return -EINVAL;
1726 		}
1727 
1728 		upper = p->role_val_to_struct[upper->bounds - 1];
1729 		ebitmap_for_each_positive_bit(&role->types, node, bit) {
1730 			if (ebitmap_get_bit(&upper->types, bit))
1731 				continue;
1732 
1733 			pr_err("SELinux: boundary violated policy: "
1734 			       "role=%s type=%s bounds=%s\n",
1735 			       sym_name(p, SYM_ROLES, role->value - 1),
1736 			       sym_name(p, SYM_TYPES, bit),
1737 			       sym_name(p, SYM_ROLES, upper->value - 1));
1738 
1739 			return -EINVAL;
1740 		}
1741 	}
1742 
1743 	return 0;
1744 }
1745 
1746 static int type_bounds_sanity_check(void *key, void *datum, void *datap)
1747 {
1748 	struct type_datum *upper;
1749 	struct policydb *p = datap;
1750 	int depth = 0;
1751 
1752 	upper = datum;
1753 	while (upper->bounds) {
1754 		if (++depth == POLICYDB_BOUNDS_MAXDEPTH) {
1755 			pr_err("SELinux: type %s: "
1756 			       "too deep or looped boundary\n",
1757 			       (char *) key);
1758 			return -EINVAL;
1759 		}
1760 
1761 		upper = p->type_val_to_struct[upper->bounds - 1];
1762 		BUG_ON(!upper);
1763 
1764 		if (upper->attribute) {
1765 			pr_err("SELinux: type %s: "
1766 			       "bounded by attribute %s\n",
1767 			       (char *) key,
1768 			       sym_name(p, SYM_TYPES, upper->value - 1));
1769 			return -EINVAL;
1770 		}
1771 	}
1772 
1773 	return 0;
1774 }
1775 
1776 static int policydb_bounds_sanity_check(struct policydb *p)
1777 {
1778 	int rc;
1779 
1780 	if (p->policyvers < POLICYDB_VERSION_BOUNDARY)
1781 		return 0;
1782 
1783 	rc = hashtab_map(&p->p_users.table, user_bounds_sanity_check, p);
1784 	if (rc)
1785 		return rc;
1786 
1787 	rc = hashtab_map(&p->p_roles.table, role_bounds_sanity_check, p);
1788 	if (rc)
1789 		return rc;
1790 
1791 	rc = hashtab_map(&p->p_types.table, type_bounds_sanity_check, p);
1792 	if (rc)
1793 		return rc;
1794 
1795 	return 0;
1796 }
1797 
1798 u16 string_to_security_class(struct policydb *p, const char *name)
1799 {
1800 	struct class_datum *cladatum;
1801 
1802 	cladatum = symtab_search(&p->p_classes, name);
1803 	if (!cladatum)
1804 		return 0;
1805 
1806 	return cladatum->value;
1807 }
1808 
1809 u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name)
1810 {
1811 	struct class_datum *cladatum;
1812 	struct perm_datum *perdatum = NULL;
1813 	struct common_datum *comdatum;
1814 
1815 	if (!tclass || tclass > p->p_classes.nprim)
1816 		return 0;
1817 
1818 	cladatum = p->class_val_to_struct[tclass-1];
1819 	comdatum = cladatum->comdatum;
1820 	if (comdatum)
1821 		perdatum = symtab_search(&comdatum->permissions, name);
1822 	if (!perdatum)
1823 		perdatum = symtab_search(&cladatum->permissions, name);
1824 	if (!perdatum)
1825 		return 0;
1826 
1827 	return 1U << (perdatum->value-1);
1828 }
1829 
1830 static int range_read(struct policydb *p, void *fp)
1831 {
1832 	struct range_trans *rt = NULL;
1833 	struct mls_range *r = NULL;
1834 	int rc;
1835 	__le32 buf[2];
1836 	u32 i, nel;
1837 
1838 	if (p->policyvers < POLICYDB_VERSION_MLS)
1839 		return 0;
1840 
1841 	rc = next_entry(buf, fp, sizeof(u32));
1842 	if (rc)
1843 		return rc;
1844 
1845 	nel = le32_to_cpu(buf[0]);
1846 
1847 	rc = hashtab_init(&p->range_tr, nel);
1848 	if (rc)
1849 		return rc;
1850 
1851 	for (i = 0; i < nel; i++) {
1852 		rc = -ENOMEM;
1853 		rt = kzalloc(sizeof(*rt), GFP_KERNEL);
1854 		if (!rt)
1855 			goto out;
1856 
1857 		rc = next_entry(buf, fp, (sizeof(u32) * 2));
1858 		if (rc)
1859 			goto out;
1860 
1861 		rt->source_type = le32_to_cpu(buf[0]);
1862 		rt->target_type = le32_to_cpu(buf[1]);
1863 		if (p->policyvers >= POLICYDB_VERSION_RANGETRANS) {
1864 			rc = next_entry(buf, fp, sizeof(u32));
1865 			if (rc)
1866 				goto out;
1867 			rt->target_class = le32_to_cpu(buf[0]);
1868 		} else
1869 			rt->target_class = p->process_class;
1870 
1871 		rc = -EINVAL;
1872 		if (!policydb_type_isvalid(p, rt->source_type) ||
1873 		    !policydb_type_isvalid(p, rt->target_type) ||
1874 		    !policydb_class_isvalid(p, rt->target_class))
1875 			goto out;
1876 
1877 		rc = -ENOMEM;
1878 		r = kzalloc(sizeof(*r), GFP_KERNEL);
1879 		if (!r)
1880 			goto out;
1881 
1882 		rc = mls_read_range_helper(r, fp);
1883 		if (rc)
1884 			goto out;
1885 
1886 		rc = -EINVAL;
1887 		if (!mls_range_isvalid(p, r)) {
1888 			pr_warn("SELinux:  rangetrans:  invalid range\n");
1889 			goto out;
1890 		}
1891 
1892 		rc = hashtab_insert(&p->range_tr, rt, r, rangetr_key_params);
1893 		if (rc)
1894 			goto out;
1895 
1896 		rt = NULL;
1897 		r = NULL;
1898 	}
1899 	hash_eval(&p->range_tr, "rangetr");
1900 	rc = 0;
1901 out:
1902 	kfree(rt);
1903 	kfree(r);
1904 	return rc;
1905 }
1906 
1907 static int filename_trans_read_helper_compat(struct policydb *p, void *fp)
1908 {
1909 	struct filename_trans_key key, *ft = NULL;
1910 	struct filename_trans_datum *last, *datum = NULL;
1911 	char *name = NULL;
1912 	u32 len, stype, otype;
1913 	__le32 buf[4];
1914 	int rc;
1915 
1916 	/* length of the path component string */
1917 	rc = next_entry(buf, fp, sizeof(u32));
1918 	if (rc)
1919 		return rc;
1920 	len = le32_to_cpu(buf[0]);
1921 
1922 	/* path component string */
1923 	rc = str_read(&name, GFP_KERNEL, fp, len);
1924 	if (rc)
1925 		return rc;
1926 
1927 	rc = next_entry(buf, fp, sizeof(u32) * 4);
1928 	if (rc)
1929 		goto out;
1930 
1931 	stype = le32_to_cpu(buf[0]);
1932 	key.ttype = le32_to_cpu(buf[1]);
1933 	key.tclass = le32_to_cpu(buf[2]);
1934 	key.name = name;
1935 
1936 	otype = le32_to_cpu(buf[3]);
1937 
1938 	last = NULL;
1939 	datum = policydb_filenametr_search(p, &key);
1940 	while (datum) {
1941 		if (unlikely(ebitmap_get_bit(&datum->stypes, stype - 1))) {
1942 			/* conflicting/duplicate rules are ignored */
1943 			datum = NULL;
1944 			goto out;
1945 		}
1946 		if (likely(datum->otype == otype))
1947 			break;
1948 		last = datum;
1949 		datum = datum->next;
1950 	}
1951 	if (!datum) {
1952 		rc = -ENOMEM;
1953 		datum = kmalloc(sizeof(*datum), GFP_KERNEL);
1954 		if (!datum)
1955 			goto out;
1956 
1957 		ebitmap_init(&datum->stypes);
1958 		datum->otype = otype;
1959 		datum->next = NULL;
1960 
1961 		if (unlikely(last)) {
1962 			last->next = datum;
1963 		} else {
1964 			rc = -ENOMEM;
1965 			ft = kmemdup(&key, sizeof(key), GFP_KERNEL);
1966 			if (!ft)
1967 				goto out;
1968 
1969 			rc = hashtab_insert(&p->filename_trans, ft, datum,
1970 					    filenametr_key_params);
1971 			if (rc)
1972 				goto out;
1973 			name = NULL;
1974 
1975 			rc = ebitmap_set_bit(&p->filename_trans_ttypes,
1976 					     key.ttype, 1);
1977 			if (rc)
1978 				return rc;
1979 		}
1980 	}
1981 	kfree(name);
1982 	return ebitmap_set_bit(&datum->stypes, stype - 1, 1);
1983 
1984 out:
1985 	kfree(ft);
1986 	kfree(name);
1987 	kfree(datum);
1988 	return rc;
1989 }
1990 
1991 static int filename_trans_read_helper(struct policydb *p, void *fp)
1992 {
1993 	struct filename_trans_key *ft = NULL;
1994 	struct filename_trans_datum **dst, *datum, *first = NULL;
1995 	char *name = NULL;
1996 	u32 len, ttype, tclass, ndatum, i;
1997 	__le32 buf[3];
1998 	int rc;
1999 
2000 	/* length of the path component string */
2001 	rc = next_entry(buf, fp, sizeof(u32));
2002 	if (rc)
2003 		return rc;
2004 	len = le32_to_cpu(buf[0]);
2005 
2006 	/* path component string */
2007 	rc = str_read(&name, GFP_KERNEL, fp, len);
2008 	if (rc)
2009 		return rc;
2010 
2011 	rc = next_entry(buf, fp, sizeof(u32) * 3);
2012 	if (rc)
2013 		goto out;
2014 
2015 	ttype = le32_to_cpu(buf[0]);
2016 	tclass = le32_to_cpu(buf[1]);
2017 
2018 	ndatum = le32_to_cpu(buf[2]);
2019 	if (ndatum == 0) {
2020 		pr_err("SELinux:  Filename transition key with no datum\n");
2021 		rc = -ENOENT;
2022 		goto out;
2023 	}
2024 
2025 	dst = &first;
2026 	for (i = 0; i < ndatum; i++) {
2027 		rc = -ENOMEM;
2028 		datum = kmalloc(sizeof(*datum), GFP_KERNEL);
2029 		if (!datum)
2030 			goto out;
2031 
2032 		datum->next = NULL;
2033 		*dst = datum;
2034 
2035 		/* ebitmap_read() will at least init the bitmap */
2036 		rc = ebitmap_read(&datum->stypes, fp);
2037 		if (rc)
2038 			goto out;
2039 
2040 		rc = next_entry(buf, fp, sizeof(u32));
2041 		if (rc)
2042 			goto out;
2043 
2044 		datum->otype = le32_to_cpu(buf[0]);
2045 
2046 		dst = &datum->next;
2047 	}
2048 
2049 	rc = -ENOMEM;
2050 	ft = kmalloc(sizeof(*ft), GFP_KERNEL);
2051 	if (!ft)
2052 		goto out;
2053 
2054 	ft->ttype = ttype;
2055 	ft->tclass = tclass;
2056 	ft->name = name;
2057 
2058 	rc = hashtab_insert(&p->filename_trans, ft, first,
2059 			    filenametr_key_params);
2060 	if (rc == -EEXIST)
2061 		pr_err("SELinux:  Duplicate filename transition key\n");
2062 	if (rc)
2063 		goto out;
2064 
2065 	return ebitmap_set_bit(&p->filename_trans_ttypes, ttype, 1);
2066 
2067 out:
2068 	kfree(ft);
2069 	kfree(name);
2070 	while (first) {
2071 		datum = first;
2072 		first = first->next;
2073 
2074 		ebitmap_destroy(&datum->stypes);
2075 		kfree(datum);
2076 	}
2077 	return rc;
2078 }
2079 
2080 static int filename_trans_read(struct policydb *p, void *fp)
2081 {
2082 	u32 nel, i;
2083 	__le32 buf[1];
2084 	int rc;
2085 
2086 	if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
2087 		return 0;
2088 
2089 	rc = next_entry(buf, fp, sizeof(u32));
2090 	if (rc)
2091 		return rc;
2092 	nel = le32_to_cpu(buf[0]);
2093 
2094 	if (p->policyvers < POLICYDB_VERSION_COMP_FTRANS) {
2095 		p->compat_filename_trans_count = nel;
2096 
2097 		rc = hashtab_init(&p->filename_trans, (1 << 11));
2098 		if (rc)
2099 			return rc;
2100 
2101 		for (i = 0; i < nel; i++) {
2102 			rc = filename_trans_read_helper_compat(p, fp);
2103 			if (rc)
2104 				return rc;
2105 		}
2106 	} else {
2107 		rc = hashtab_init(&p->filename_trans, nel);
2108 		if (rc)
2109 			return rc;
2110 
2111 		for (i = 0; i < nel; i++) {
2112 			rc = filename_trans_read_helper(p, fp);
2113 			if (rc)
2114 				return rc;
2115 		}
2116 	}
2117 	hash_eval(&p->filename_trans, "filenametr");
2118 	return 0;
2119 }
2120 
2121 static int genfs_read(struct policydb *p, void *fp)
2122 {
2123 	int rc;
2124 	u32 i, j, nel, nel2, len, len2;
2125 	__le32 buf[1];
2126 	struct ocontext *l, *c;
2127 	struct ocontext *newc = NULL;
2128 	struct genfs *genfs_p, *genfs;
2129 	struct genfs *newgenfs = NULL;
2130 
2131 	rc = next_entry(buf, fp, sizeof(u32));
2132 	if (rc)
2133 		return rc;
2134 	nel = le32_to_cpu(buf[0]);
2135 
2136 	for (i = 0; i < nel; i++) {
2137 		rc = next_entry(buf, fp, sizeof(u32));
2138 		if (rc)
2139 			goto out;
2140 		len = le32_to_cpu(buf[0]);
2141 
2142 		rc = -ENOMEM;
2143 		newgenfs = kzalloc(sizeof(*newgenfs), GFP_KERNEL);
2144 		if (!newgenfs)
2145 			goto out;
2146 
2147 		rc = str_read(&newgenfs->fstype, GFP_KERNEL, fp, len);
2148 		if (rc)
2149 			goto out;
2150 
2151 		for (genfs_p = NULL, genfs = p->genfs; genfs;
2152 		     genfs_p = genfs, genfs = genfs->next) {
2153 			rc = -EINVAL;
2154 			if (strcmp(newgenfs->fstype, genfs->fstype) == 0) {
2155 				pr_err("SELinux:  dup genfs fstype %s\n",
2156 				       newgenfs->fstype);
2157 				goto out;
2158 			}
2159 			if (strcmp(newgenfs->fstype, genfs->fstype) < 0)
2160 				break;
2161 		}
2162 		newgenfs->next = genfs;
2163 		if (genfs_p)
2164 			genfs_p->next = newgenfs;
2165 		else
2166 			p->genfs = newgenfs;
2167 		genfs = newgenfs;
2168 		newgenfs = NULL;
2169 
2170 		rc = next_entry(buf, fp, sizeof(u32));
2171 		if (rc)
2172 			goto out;
2173 
2174 		nel2 = le32_to_cpu(buf[0]);
2175 		for (j = 0; j < nel2; j++) {
2176 			rc = next_entry(buf, fp, sizeof(u32));
2177 			if (rc)
2178 				goto out;
2179 			len = le32_to_cpu(buf[0]);
2180 
2181 			rc = -ENOMEM;
2182 			newc = kzalloc(sizeof(*newc), GFP_KERNEL);
2183 			if (!newc)
2184 				goto out;
2185 
2186 			rc = str_read(&newc->u.name, GFP_KERNEL, fp, len);
2187 			if (rc)
2188 				goto out;
2189 
2190 			rc = next_entry(buf, fp, sizeof(u32));
2191 			if (rc)
2192 				goto out;
2193 
2194 			newc->v.sclass = le32_to_cpu(buf[0]);
2195 			rc = context_read_and_validate(&newc->context[0], p, fp);
2196 			if (rc)
2197 				goto out;
2198 
2199 			for (l = NULL, c = genfs->head; c;
2200 			     l = c, c = c->next) {
2201 				rc = -EINVAL;
2202 				if (!strcmp(newc->u.name, c->u.name) &&
2203 				    (!c->v.sclass || !newc->v.sclass ||
2204 				     newc->v.sclass == c->v.sclass)) {
2205 					pr_err("SELinux:  dup genfs entry (%s,%s)\n",
2206 					       genfs->fstype, c->u.name);
2207 					goto out;
2208 				}
2209 				len = strlen(newc->u.name);
2210 				len2 = strlen(c->u.name);
2211 				if (len > len2)
2212 					break;
2213 			}
2214 
2215 			newc->next = c;
2216 			if (l)
2217 				l->next = newc;
2218 			else
2219 				genfs->head = newc;
2220 			newc = NULL;
2221 		}
2222 	}
2223 	rc = 0;
2224 out:
2225 	if (newgenfs) {
2226 		kfree(newgenfs->fstype);
2227 		kfree(newgenfs);
2228 	}
2229 	ocontext_destroy(newc, OCON_FSUSE);
2230 
2231 	return rc;
2232 }
2233 
2234 static int ocontext_read(struct policydb *p, const struct policydb_compat_info *info,
2235 			 void *fp)
2236 {
2237 	int rc;
2238 	unsigned int i;
2239 	u32 j, nel, len;
2240 	__be64 prefixbuf[1];
2241 	__le32 buf[3];
2242 	struct ocontext *l, *c;
2243 	u32 nodebuf[8];
2244 
2245 	for (i = 0; i < info->ocon_num; i++) {
2246 		rc = next_entry(buf, fp, sizeof(u32));
2247 		if (rc)
2248 			goto out;
2249 		nel = le32_to_cpu(buf[0]);
2250 
2251 		l = NULL;
2252 		for (j = 0; j < nel; j++) {
2253 			rc = -ENOMEM;
2254 			c = kzalloc(sizeof(*c), GFP_KERNEL);
2255 			if (!c)
2256 				goto out;
2257 			if (l)
2258 				l->next = c;
2259 			else
2260 				p->ocontexts[i] = c;
2261 			l = c;
2262 
2263 			switch (i) {
2264 			case OCON_ISID:
2265 				rc = next_entry(buf, fp, sizeof(u32));
2266 				if (rc)
2267 					goto out;
2268 
2269 				c->sid[0] = le32_to_cpu(buf[0]);
2270 				rc = context_read_and_validate(&c->context[0], p, fp);
2271 				if (rc)
2272 					goto out;
2273 				break;
2274 			case OCON_FS:
2275 			case OCON_NETIF:
2276 				rc = next_entry(buf, fp, sizeof(u32));
2277 				if (rc)
2278 					goto out;
2279 				len = le32_to_cpu(buf[0]);
2280 
2281 				rc = str_read(&c->u.name, GFP_KERNEL, fp, len);
2282 				if (rc)
2283 					goto out;
2284 
2285 				if (i == OCON_FS)
2286 					pr_warn("SELinux:  void and deprecated fs ocon %s\n",
2287 						c->u.name);
2288 
2289 				rc = context_read_and_validate(&c->context[0], p, fp);
2290 				if (rc)
2291 					goto out;
2292 				rc = context_read_and_validate(&c->context[1], p, fp);
2293 				if (rc)
2294 					goto out;
2295 				break;
2296 			case OCON_PORT:
2297 				rc = next_entry(buf, fp, sizeof(u32)*3);
2298 				if (rc)
2299 					goto out;
2300 				c->u.port.protocol = le32_to_cpu(buf[0]);
2301 				c->u.port.low_port = le32_to_cpu(buf[1]);
2302 				c->u.port.high_port = le32_to_cpu(buf[2]);
2303 				rc = context_read_and_validate(&c->context[0], p, fp);
2304 				if (rc)
2305 					goto out;
2306 				break;
2307 			case OCON_NODE:
2308 				rc = next_entry(nodebuf, fp, sizeof(u32) * 2);
2309 				if (rc)
2310 					goto out;
2311 				c->u.node.addr = nodebuf[0]; /* network order */
2312 				c->u.node.mask = nodebuf[1]; /* network order */
2313 				rc = context_read_and_validate(&c->context[0], p, fp);
2314 				if (rc)
2315 					goto out;
2316 				break;
2317 			case OCON_FSUSE:
2318 				rc = next_entry(buf, fp, sizeof(u32)*2);
2319 				if (rc)
2320 					goto out;
2321 
2322 				rc = -EINVAL;
2323 				c->v.behavior = le32_to_cpu(buf[0]);
2324 				/* Determined at runtime, not in policy DB. */
2325 				if (c->v.behavior == SECURITY_FS_USE_MNTPOINT)
2326 					goto out;
2327 				if (c->v.behavior > SECURITY_FS_USE_MAX)
2328 					goto out;
2329 
2330 				len = le32_to_cpu(buf[1]);
2331 				rc = str_read(&c->u.name, GFP_KERNEL, fp, len);
2332 				if (rc)
2333 					goto out;
2334 
2335 				rc = context_read_and_validate(&c->context[0], p, fp);
2336 				if (rc)
2337 					goto out;
2338 				break;
2339 			case OCON_NODE6: {
2340 				int k;
2341 
2342 				rc = next_entry(nodebuf, fp, sizeof(u32) * 8);
2343 				if (rc)
2344 					goto out;
2345 				for (k = 0; k < 4; k++)
2346 					c->u.node6.addr[k] = nodebuf[k];
2347 				for (k = 0; k < 4; k++)
2348 					c->u.node6.mask[k] = nodebuf[k+4];
2349 				rc = context_read_and_validate(&c->context[0], p, fp);
2350 				if (rc)
2351 					goto out;
2352 				break;
2353 			}
2354 			case OCON_IBPKEY: {
2355 				u32 pkey_lo, pkey_hi;
2356 
2357 				rc = next_entry(prefixbuf, fp, sizeof(u64));
2358 				if (rc)
2359 					goto out;
2360 
2361 				/* we need to have subnet_prefix in CPU order */
2362 				c->u.ibpkey.subnet_prefix = be64_to_cpu(prefixbuf[0]);
2363 
2364 				rc = next_entry(buf, fp, sizeof(u32) * 2);
2365 				if (rc)
2366 					goto out;
2367 
2368 				pkey_lo = le32_to_cpu(buf[0]);
2369 				pkey_hi = le32_to_cpu(buf[1]);
2370 
2371 				if (pkey_lo > U16_MAX || pkey_hi > U16_MAX) {
2372 					rc = -EINVAL;
2373 					goto out;
2374 				}
2375 
2376 				c->u.ibpkey.low_pkey  = pkey_lo;
2377 				c->u.ibpkey.high_pkey = pkey_hi;
2378 
2379 				rc = context_read_and_validate(&c->context[0],
2380 							       p,
2381 							       fp);
2382 				if (rc)
2383 					goto out;
2384 				break;
2385 			}
2386 			case OCON_IBENDPORT: {
2387 				u32 port;
2388 
2389 				rc = next_entry(buf, fp, sizeof(u32) * 2);
2390 				if (rc)
2391 					goto out;
2392 				len = le32_to_cpu(buf[0]);
2393 
2394 				rc = str_read(&c->u.ibendport.dev_name, GFP_KERNEL, fp, len);
2395 				if (rc)
2396 					goto out;
2397 
2398 				port = le32_to_cpu(buf[1]);
2399 				if (port > U8_MAX || port == 0) {
2400 					rc = -EINVAL;
2401 					goto out;
2402 				}
2403 
2404 				c->u.ibendport.port = port;
2405 
2406 				rc = context_read_and_validate(&c->context[0],
2407 							       p,
2408 							       fp);
2409 				if (rc)
2410 					goto out;
2411 				break;
2412 			} /* end case */
2413 			} /* end switch */
2414 		}
2415 	}
2416 	rc = 0;
2417 out:
2418 	return rc;
2419 }
2420 
2421 /*
2422  * Read the configuration data from a policy database binary
2423  * representation file into a policy database structure.
2424  */
2425 int policydb_read(struct policydb *p, void *fp)
2426 {
2427 	struct role_allow *ra, *lra;
2428 	struct role_trans_key *rtk = NULL;
2429 	struct role_trans_datum *rtd = NULL;
2430 	int rc;
2431 	__le32 buf[4];
2432 	u32 i, j, len, nprim, nel, perm;
2433 
2434 	char *policydb_str;
2435 	const struct policydb_compat_info *info;
2436 
2437 	policydb_init(p);
2438 
2439 	/* Read the magic number and string length. */
2440 	rc = next_entry(buf, fp, sizeof(u32) * 2);
2441 	if (rc)
2442 		goto bad;
2443 
2444 	rc = -EINVAL;
2445 	if (le32_to_cpu(buf[0]) != POLICYDB_MAGIC) {
2446 		pr_err("SELinux:  policydb magic number 0x%x does "
2447 		       "not match expected magic number 0x%x\n",
2448 		       le32_to_cpu(buf[0]), POLICYDB_MAGIC);
2449 		goto bad;
2450 	}
2451 
2452 	rc = -EINVAL;
2453 	len = le32_to_cpu(buf[1]);
2454 	if (len != strlen(POLICYDB_STRING)) {
2455 		pr_err("SELinux:  policydb string length %d does not "
2456 		       "match expected length %zu\n",
2457 		       len, strlen(POLICYDB_STRING));
2458 		goto bad;
2459 	}
2460 
2461 	rc = -ENOMEM;
2462 	policydb_str = kmalloc(len + 1, GFP_KERNEL);
2463 	if (!policydb_str) {
2464 		pr_err("SELinux:  unable to allocate memory for policydb "
2465 		       "string of length %d\n", len);
2466 		goto bad;
2467 	}
2468 
2469 	rc = next_entry(policydb_str, fp, len);
2470 	if (rc) {
2471 		pr_err("SELinux:  truncated policydb string identifier\n");
2472 		kfree(policydb_str);
2473 		goto bad;
2474 	}
2475 
2476 	rc = -EINVAL;
2477 	policydb_str[len] = '\0';
2478 	if (strcmp(policydb_str, POLICYDB_STRING)) {
2479 		pr_err("SELinux:  policydb string %s does not match "
2480 		       "my string %s\n", policydb_str, POLICYDB_STRING);
2481 		kfree(policydb_str);
2482 		goto bad;
2483 	}
2484 	/* Done with policydb_str. */
2485 	kfree(policydb_str);
2486 	policydb_str = NULL;
2487 
2488 	/* Read the version and table sizes. */
2489 	rc = next_entry(buf, fp, sizeof(u32)*4);
2490 	if (rc)
2491 		goto bad;
2492 
2493 	rc = -EINVAL;
2494 	p->policyvers = le32_to_cpu(buf[0]);
2495 	if (p->policyvers < POLICYDB_VERSION_MIN ||
2496 	    p->policyvers > POLICYDB_VERSION_MAX) {
2497 		pr_err("SELinux:  policydb version %d does not match "
2498 		       "my version range %d-%d\n",
2499 		       le32_to_cpu(buf[0]), POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX);
2500 		goto bad;
2501 	}
2502 
2503 	if ((le32_to_cpu(buf[1]) & POLICYDB_CONFIG_MLS)) {
2504 		p->mls_enabled = 1;
2505 
2506 		rc = -EINVAL;
2507 		if (p->policyvers < POLICYDB_VERSION_MLS) {
2508 			pr_err("SELinux: security policydb version %d "
2509 				"(MLS) not backwards compatible\n",
2510 				p->policyvers);
2511 			goto bad;
2512 		}
2513 	}
2514 	p->reject_unknown = !!(le32_to_cpu(buf[1]) & REJECT_UNKNOWN);
2515 	p->allow_unknown = !!(le32_to_cpu(buf[1]) & ALLOW_UNKNOWN);
2516 
2517 	if (p->policyvers >= POLICYDB_VERSION_POLCAP) {
2518 		rc = ebitmap_read(&p->policycaps, fp);
2519 		if (rc)
2520 			goto bad;
2521 	}
2522 
2523 	if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE) {
2524 		rc = ebitmap_read(&p->permissive_map, fp);
2525 		if (rc)
2526 			goto bad;
2527 	}
2528 
2529 	rc = -EINVAL;
2530 	info = policydb_lookup_compat(p->policyvers);
2531 	if (!info) {
2532 		pr_err("SELinux:  unable to find policy compat info "
2533 		       "for version %d\n", p->policyvers);
2534 		goto bad;
2535 	}
2536 
2537 	rc = -EINVAL;
2538 	if (le32_to_cpu(buf[2]) != info->sym_num ||
2539 		le32_to_cpu(buf[3]) != info->ocon_num) {
2540 		pr_err("SELinux:  policydb table sizes (%d,%d) do "
2541 		       "not match mine (%d,%d)\n", le32_to_cpu(buf[2]),
2542 			le32_to_cpu(buf[3]),
2543 		       info->sym_num, info->ocon_num);
2544 		goto bad;
2545 	}
2546 
2547 	for (i = 0; i < info->sym_num; i++) {
2548 		rc = next_entry(buf, fp, sizeof(u32)*2);
2549 		if (rc)
2550 			goto bad;
2551 		nprim = le32_to_cpu(buf[0]);
2552 		nel = le32_to_cpu(buf[1]);
2553 
2554 		rc = symtab_init(&p->symtab[i], nel);
2555 		if (rc)
2556 			goto out;
2557 
2558 		if (i == SYM_ROLES) {
2559 			rc = roles_init(p);
2560 			if (rc)
2561 				goto out;
2562 		}
2563 
2564 		for (j = 0; j < nel; j++) {
2565 			rc = read_f[i](p, &p->symtab[i], fp);
2566 			if (rc)
2567 				goto bad;
2568 		}
2569 
2570 		p->symtab[i].nprim = nprim;
2571 	}
2572 
2573 	rc = -EINVAL;
2574 	p->process_class = string_to_security_class(p, "process");
2575 	if (!p->process_class) {
2576 		pr_err("SELinux: process class is required, not defined in policy\n");
2577 		goto bad;
2578 	}
2579 
2580 	rc = avtab_read(&p->te_avtab, fp, p);
2581 	if (rc)
2582 		goto bad;
2583 
2584 	if (p->policyvers >= POLICYDB_VERSION_BOOL) {
2585 		rc = cond_read_list(p, fp);
2586 		if (rc)
2587 			goto bad;
2588 	}
2589 
2590 	rc = next_entry(buf, fp, sizeof(u32));
2591 	if (rc)
2592 		goto bad;
2593 	nel = le32_to_cpu(buf[0]);
2594 
2595 	rc = hashtab_init(&p->role_tr, nel);
2596 	if (rc)
2597 		goto bad;
2598 	for (i = 0; i < nel; i++) {
2599 		rc = -ENOMEM;
2600 		rtk = kmalloc(sizeof(*rtk), GFP_KERNEL);
2601 		if (!rtk)
2602 			goto bad;
2603 
2604 		rc = -ENOMEM;
2605 		rtd = kmalloc(sizeof(*rtd), GFP_KERNEL);
2606 		if (!rtd)
2607 			goto bad;
2608 
2609 		rc = next_entry(buf, fp, sizeof(u32)*3);
2610 		if (rc)
2611 			goto bad;
2612 
2613 		rtk->role = le32_to_cpu(buf[0]);
2614 		rtk->type = le32_to_cpu(buf[1]);
2615 		rtd->new_role = le32_to_cpu(buf[2]);
2616 		if (p->policyvers >= POLICYDB_VERSION_ROLETRANS) {
2617 			rc = next_entry(buf, fp, sizeof(u32));
2618 			if (rc)
2619 				goto bad;
2620 			rtk->tclass = le32_to_cpu(buf[0]);
2621 		} else
2622 			rtk->tclass = p->process_class;
2623 
2624 		rc = -EINVAL;
2625 		if (!policydb_role_isvalid(p, rtk->role) ||
2626 		    !policydb_type_isvalid(p, rtk->type) ||
2627 		    !policydb_class_isvalid(p, rtk->tclass) ||
2628 		    !policydb_role_isvalid(p, rtd->new_role))
2629 			goto bad;
2630 
2631 		rc = hashtab_insert(&p->role_tr, rtk, rtd, roletr_key_params);
2632 		if (rc)
2633 			goto bad;
2634 
2635 		rtk = NULL;
2636 		rtd = NULL;
2637 	}
2638 
2639 	rc = next_entry(buf, fp, sizeof(u32));
2640 	if (rc)
2641 		goto bad;
2642 	nel = le32_to_cpu(buf[0]);
2643 	lra = NULL;
2644 	for (i = 0; i < nel; i++) {
2645 		rc = -ENOMEM;
2646 		ra = kzalloc(sizeof(*ra), GFP_KERNEL);
2647 		if (!ra)
2648 			goto bad;
2649 		if (lra)
2650 			lra->next = ra;
2651 		else
2652 			p->role_allow = ra;
2653 		rc = next_entry(buf, fp, sizeof(u32)*2);
2654 		if (rc)
2655 			goto bad;
2656 
2657 		rc = -EINVAL;
2658 		ra->role = le32_to_cpu(buf[0]);
2659 		ra->new_role = le32_to_cpu(buf[1]);
2660 		if (!policydb_role_isvalid(p, ra->role) ||
2661 		    !policydb_role_isvalid(p, ra->new_role))
2662 			goto bad;
2663 		lra = ra;
2664 	}
2665 
2666 	rc = filename_trans_read(p, fp);
2667 	if (rc)
2668 		goto bad;
2669 
2670 	rc = policydb_index(p);
2671 	if (rc)
2672 		goto bad;
2673 
2674 	rc = -EINVAL;
2675 	perm = string_to_av_perm(p, p->process_class, "transition");
2676 	if (!perm) {
2677 		pr_err("SELinux: process transition permission is required, not defined in policy\n");
2678 		goto bad;
2679 	}
2680 	p->process_trans_perms = perm;
2681 	perm = string_to_av_perm(p, p->process_class, "dyntransition");
2682 	if (!perm) {
2683 		pr_err("SELinux: process dyntransition permission is required, not defined in policy\n");
2684 		goto bad;
2685 	}
2686 	p->process_trans_perms |= perm;
2687 
2688 	rc = ocontext_read(p, info, fp);
2689 	if (rc)
2690 		goto bad;
2691 
2692 	rc = genfs_read(p, fp);
2693 	if (rc)
2694 		goto bad;
2695 
2696 	rc = range_read(p, fp);
2697 	if (rc)
2698 		goto bad;
2699 
2700 	rc = -ENOMEM;
2701 	p->type_attr_map_array = kvcalloc(p->p_types.nprim,
2702 					  sizeof(*p->type_attr_map_array),
2703 					  GFP_KERNEL);
2704 	if (!p->type_attr_map_array)
2705 		goto bad;
2706 
2707 	/* just in case ebitmap_init() becomes more than just a memset(0): */
2708 	for (i = 0; i < p->p_types.nprim; i++)
2709 		ebitmap_init(&p->type_attr_map_array[i]);
2710 
2711 	for (i = 0; i < p->p_types.nprim; i++) {
2712 		struct ebitmap *e = &p->type_attr_map_array[i];
2713 
2714 		if (p->policyvers >= POLICYDB_VERSION_AVTAB) {
2715 			rc = ebitmap_read(e, fp);
2716 			if (rc)
2717 				goto bad;
2718 		}
2719 		/* add the type itself as the degenerate case */
2720 		rc = ebitmap_set_bit(e, i, 1);
2721 		if (rc)
2722 			goto bad;
2723 	}
2724 
2725 	rc = policydb_bounds_sanity_check(p);
2726 	if (rc)
2727 		goto bad;
2728 
2729 	rc = 0;
2730 out:
2731 	return rc;
2732 bad:
2733 	kfree(rtk);
2734 	kfree(rtd);
2735 	policydb_destroy(p);
2736 	goto out;
2737 }
2738 
2739 /*
2740  * Write a MLS level structure to a policydb binary
2741  * representation file.
2742  */
2743 static int mls_write_level(struct mls_level *l, void *fp)
2744 {
2745 	__le32 buf[1];
2746 	int rc;
2747 
2748 	buf[0] = cpu_to_le32(l->sens);
2749 	rc = put_entry(buf, sizeof(u32), 1, fp);
2750 	if (rc)
2751 		return rc;
2752 
2753 	rc = ebitmap_write(&l->cat, fp);
2754 	if (rc)
2755 		return rc;
2756 
2757 	return 0;
2758 }
2759 
2760 /*
2761  * Write a MLS range structure to a policydb binary
2762  * representation file.
2763  */
2764 static int mls_write_range_helper(struct mls_range *r, void *fp)
2765 {
2766 	__le32 buf[3];
2767 	size_t items;
2768 	int rc, eq;
2769 
2770 	eq = mls_level_eq(&r->level[1], &r->level[0]);
2771 
2772 	if (eq)
2773 		items = 2;
2774 	else
2775 		items = 3;
2776 	buf[0] = cpu_to_le32(items-1);
2777 	buf[1] = cpu_to_le32(r->level[0].sens);
2778 	if (!eq)
2779 		buf[2] = cpu_to_le32(r->level[1].sens);
2780 
2781 	BUG_ON(items > ARRAY_SIZE(buf));
2782 
2783 	rc = put_entry(buf, sizeof(u32), items, fp);
2784 	if (rc)
2785 		return rc;
2786 
2787 	rc = ebitmap_write(&r->level[0].cat, fp);
2788 	if (rc)
2789 		return rc;
2790 	if (!eq) {
2791 		rc = ebitmap_write(&r->level[1].cat, fp);
2792 		if (rc)
2793 			return rc;
2794 	}
2795 
2796 	return 0;
2797 }
2798 
2799 static int sens_write(void *vkey, void *datum, void *ptr)
2800 {
2801 	char *key = vkey;
2802 	struct level_datum *levdatum = datum;
2803 	struct policy_data *pd = ptr;
2804 	void *fp = pd->fp;
2805 	__le32 buf[2];
2806 	size_t len;
2807 	int rc;
2808 
2809 	len = strlen(key);
2810 	buf[0] = cpu_to_le32(len);
2811 	buf[1] = cpu_to_le32(levdatum->isalias);
2812 	rc = put_entry(buf, sizeof(u32), 2, fp);
2813 	if (rc)
2814 		return rc;
2815 
2816 	rc = put_entry(key, 1, len, fp);
2817 	if (rc)
2818 		return rc;
2819 
2820 	rc = mls_write_level(levdatum->level, fp);
2821 	if (rc)
2822 		return rc;
2823 
2824 	return 0;
2825 }
2826 
2827 static int cat_write(void *vkey, void *datum, void *ptr)
2828 {
2829 	char *key = vkey;
2830 	struct cat_datum *catdatum = datum;
2831 	struct policy_data *pd = ptr;
2832 	void *fp = pd->fp;
2833 	__le32 buf[3];
2834 	size_t len;
2835 	int rc;
2836 
2837 	len = strlen(key);
2838 	buf[0] = cpu_to_le32(len);
2839 	buf[1] = cpu_to_le32(catdatum->value);
2840 	buf[2] = cpu_to_le32(catdatum->isalias);
2841 	rc = put_entry(buf, sizeof(u32), 3, fp);
2842 	if (rc)
2843 		return rc;
2844 
2845 	rc = put_entry(key, 1, len, fp);
2846 	if (rc)
2847 		return rc;
2848 
2849 	return 0;
2850 }
2851 
2852 static int role_trans_write_one(void *key, void *datum, void *ptr)
2853 {
2854 	struct role_trans_key *rtk = key;
2855 	struct role_trans_datum *rtd = datum;
2856 	struct policy_data *pd = ptr;
2857 	void *fp = pd->fp;
2858 	struct policydb *p = pd->p;
2859 	__le32 buf[3];
2860 	int rc;
2861 
2862 	buf[0] = cpu_to_le32(rtk->role);
2863 	buf[1] = cpu_to_le32(rtk->type);
2864 	buf[2] = cpu_to_le32(rtd->new_role);
2865 	rc = put_entry(buf, sizeof(u32), 3, fp);
2866 	if (rc)
2867 		return rc;
2868 	if (p->policyvers >= POLICYDB_VERSION_ROLETRANS) {
2869 		buf[0] = cpu_to_le32(rtk->tclass);
2870 		rc = put_entry(buf, sizeof(u32), 1, fp);
2871 		if (rc)
2872 			return rc;
2873 	}
2874 	return 0;
2875 }
2876 
2877 static int role_trans_write(struct policydb *p, void *fp)
2878 {
2879 	struct policy_data pd = { .p = p, .fp = fp };
2880 	__le32 buf[1];
2881 	int rc;
2882 
2883 	buf[0] = cpu_to_le32(p->role_tr.nel);
2884 	rc = put_entry(buf, sizeof(u32), 1, fp);
2885 	if (rc)
2886 		return rc;
2887 
2888 	return hashtab_map(&p->role_tr, role_trans_write_one, &pd);
2889 }
2890 
2891 static int role_allow_write(struct role_allow *r, void *fp)
2892 {
2893 	struct role_allow *ra;
2894 	__le32 buf[2];
2895 	size_t nel;
2896 	int rc;
2897 
2898 	nel = 0;
2899 	for (ra = r; ra; ra = ra->next)
2900 		nel++;
2901 	buf[0] = cpu_to_le32(nel);
2902 	rc = put_entry(buf, sizeof(u32), 1, fp);
2903 	if (rc)
2904 		return rc;
2905 	for (ra = r; ra; ra = ra->next) {
2906 		buf[0] = cpu_to_le32(ra->role);
2907 		buf[1] = cpu_to_le32(ra->new_role);
2908 		rc = put_entry(buf, sizeof(u32), 2, fp);
2909 		if (rc)
2910 			return rc;
2911 	}
2912 	return 0;
2913 }
2914 
2915 /*
2916  * Write a security context structure
2917  * to a policydb binary representation file.
2918  */
2919 static int context_write(struct policydb *p, struct context *c,
2920 			 void *fp)
2921 {
2922 	int rc;
2923 	__le32 buf[3];
2924 
2925 	buf[0] = cpu_to_le32(c->user);
2926 	buf[1] = cpu_to_le32(c->role);
2927 	buf[2] = cpu_to_le32(c->type);
2928 
2929 	rc = put_entry(buf, sizeof(u32), 3, fp);
2930 	if (rc)
2931 		return rc;
2932 
2933 	rc = mls_write_range_helper(&c->range, fp);
2934 	if (rc)
2935 		return rc;
2936 
2937 	return 0;
2938 }
2939 
2940 /*
2941  * The following *_write functions are used to
2942  * write the symbol data to a policy database
2943  * binary representation file.
2944  */
2945 
2946 static int perm_write(void *vkey, void *datum, void *fp)
2947 {
2948 	char *key = vkey;
2949 	struct perm_datum *perdatum = datum;
2950 	__le32 buf[2];
2951 	size_t len;
2952 	int rc;
2953 
2954 	len = strlen(key);
2955 	buf[0] = cpu_to_le32(len);
2956 	buf[1] = cpu_to_le32(perdatum->value);
2957 	rc = put_entry(buf, sizeof(u32), 2, fp);
2958 	if (rc)
2959 		return rc;
2960 
2961 	rc = put_entry(key, 1, len, fp);
2962 	if (rc)
2963 		return rc;
2964 
2965 	return 0;
2966 }
2967 
2968 static int common_write(void *vkey, void *datum, void *ptr)
2969 {
2970 	char *key = vkey;
2971 	struct common_datum *comdatum = datum;
2972 	struct policy_data *pd = ptr;
2973 	void *fp = pd->fp;
2974 	__le32 buf[4];
2975 	size_t len;
2976 	int rc;
2977 
2978 	len = strlen(key);
2979 	buf[0] = cpu_to_le32(len);
2980 	buf[1] = cpu_to_le32(comdatum->value);
2981 	buf[2] = cpu_to_le32(comdatum->permissions.nprim);
2982 	buf[3] = cpu_to_le32(comdatum->permissions.table.nel);
2983 	rc = put_entry(buf, sizeof(u32), 4, fp);
2984 	if (rc)
2985 		return rc;
2986 
2987 	rc = put_entry(key, 1, len, fp);
2988 	if (rc)
2989 		return rc;
2990 
2991 	rc = hashtab_map(&comdatum->permissions.table, perm_write, fp);
2992 	if (rc)
2993 		return rc;
2994 
2995 	return 0;
2996 }
2997 
2998 static int type_set_write(struct type_set *t, void *fp)
2999 {
3000 	int rc;
3001 	__le32 buf[1];
3002 
3003 	if (ebitmap_write(&t->types, fp))
3004 		return -EINVAL;
3005 	if (ebitmap_write(&t->negset, fp))
3006 		return -EINVAL;
3007 
3008 	buf[0] = cpu_to_le32(t->flags);
3009 	rc = put_entry(buf, sizeof(u32), 1, fp);
3010 	if (rc)
3011 		return -EINVAL;
3012 
3013 	return 0;
3014 }
3015 
3016 static int write_cons_helper(struct policydb *p, struct constraint_node *node,
3017 			     void *fp)
3018 {
3019 	struct constraint_node *c;
3020 	struct constraint_expr *e;
3021 	__le32 buf[3];
3022 	u32 nel;
3023 	int rc;
3024 
3025 	for (c = node; c; c = c->next) {
3026 		nel = 0;
3027 		for (e = c->expr; e; e = e->next)
3028 			nel++;
3029 		buf[0] = cpu_to_le32(c->permissions);
3030 		buf[1] = cpu_to_le32(nel);
3031 		rc = put_entry(buf, sizeof(u32), 2, fp);
3032 		if (rc)
3033 			return rc;
3034 		for (e = c->expr; e; e = e->next) {
3035 			buf[0] = cpu_to_le32(e->expr_type);
3036 			buf[1] = cpu_to_le32(e->attr);
3037 			buf[2] = cpu_to_le32(e->op);
3038 			rc = put_entry(buf, sizeof(u32), 3, fp);
3039 			if (rc)
3040 				return rc;
3041 
3042 			switch (e->expr_type) {
3043 			case CEXPR_NAMES:
3044 				rc = ebitmap_write(&e->names, fp);
3045 				if (rc)
3046 					return rc;
3047 				if (p->policyvers >=
3048 					POLICYDB_VERSION_CONSTRAINT_NAMES) {
3049 					rc = type_set_write(e->type_names, fp);
3050 					if (rc)
3051 						return rc;
3052 				}
3053 				break;
3054 			default:
3055 				break;
3056 			}
3057 		}
3058 	}
3059 
3060 	return 0;
3061 }
3062 
3063 static int class_write(void *vkey, void *datum, void *ptr)
3064 {
3065 	char *key = vkey;
3066 	struct class_datum *cladatum = datum;
3067 	struct policy_data *pd = ptr;
3068 	void *fp = pd->fp;
3069 	struct policydb *p = pd->p;
3070 	struct constraint_node *c;
3071 	__le32 buf[6];
3072 	u32 ncons;
3073 	size_t len, len2;
3074 	int rc;
3075 
3076 	len = strlen(key);
3077 	if (cladatum->comkey)
3078 		len2 = strlen(cladatum->comkey);
3079 	else
3080 		len2 = 0;
3081 
3082 	ncons = 0;
3083 	for (c = cladatum->constraints; c; c = c->next)
3084 		ncons++;
3085 
3086 	buf[0] = cpu_to_le32(len);
3087 	buf[1] = cpu_to_le32(len2);
3088 	buf[2] = cpu_to_le32(cladatum->value);
3089 	buf[3] = cpu_to_le32(cladatum->permissions.nprim);
3090 	buf[4] = cpu_to_le32(cladatum->permissions.table.nel);
3091 	buf[5] = cpu_to_le32(ncons);
3092 	rc = put_entry(buf, sizeof(u32), 6, fp);
3093 	if (rc)
3094 		return rc;
3095 
3096 	rc = put_entry(key, 1, len, fp);
3097 	if (rc)
3098 		return rc;
3099 
3100 	if (cladatum->comkey) {
3101 		rc = put_entry(cladatum->comkey, 1, len2, fp);
3102 		if (rc)
3103 			return rc;
3104 	}
3105 
3106 	rc = hashtab_map(&cladatum->permissions.table, perm_write, fp);
3107 	if (rc)
3108 		return rc;
3109 
3110 	rc = write_cons_helper(p, cladatum->constraints, fp);
3111 	if (rc)
3112 		return rc;
3113 
3114 	/* write out the validatetrans rule */
3115 	ncons = 0;
3116 	for (c = cladatum->validatetrans; c; c = c->next)
3117 		ncons++;
3118 
3119 	buf[0] = cpu_to_le32(ncons);
3120 	rc = put_entry(buf, sizeof(u32), 1, fp);
3121 	if (rc)
3122 		return rc;
3123 
3124 	rc = write_cons_helper(p, cladatum->validatetrans, fp);
3125 	if (rc)
3126 		return rc;
3127 
3128 	if (p->policyvers >= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS) {
3129 		buf[0] = cpu_to_le32(cladatum->default_user);
3130 		buf[1] = cpu_to_le32(cladatum->default_role);
3131 		buf[2] = cpu_to_le32(cladatum->default_range);
3132 
3133 		rc = put_entry(buf, sizeof(uint32_t), 3, fp);
3134 		if (rc)
3135 			return rc;
3136 	}
3137 
3138 	if (p->policyvers >= POLICYDB_VERSION_DEFAULT_TYPE) {
3139 		buf[0] = cpu_to_le32(cladatum->default_type);
3140 		rc = put_entry(buf, sizeof(uint32_t), 1, fp);
3141 		if (rc)
3142 			return rc;
3143 	}
3144 
3145 	return 0;
3146 }
3147 
3148 static int role_write(void *vkey, void *datum, void *ptr)
3149 {
3150 	char *key = vkey;
3151 	struct role_datum *role = datum;
3152 	struct policy_data *pd = ptr;
3153 	void *fp = pd->fp;
3154 	struct policydb *p = pd->p;
3155 	__le32 buf[3];
3156 	size_t items, len;
3157 	int rc;
3158 
3159 	len = strlen(key);
3160 	items = 0;
3161 	buf[items++] = cpu_to_le32(len);
3162 	buf[items++] = cpu_to_le32(role->value);
3163 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
3164 		buf[items++] = cpu_to_le32(role->bounds);
3165 
3166 	BUG_ON(items > ARRAY_SIZE(buf));
3167 
3168 	rc = put_entry(buf, sizeof(u32), items, fp);
3169 	if (rc)
3170 		return rc;
3171 
3172 	rc = put_entry(key, 1, len, fp);
3173 	if (rc)
3174 		return rc;
3175 
3176 	rc = ebitmap_write(&role->dominates, fp);
3177 	if (rc)
3178 		return rc;
3179 
3180 	rc = ebitmap_write(&role->types, fp);
3181 	if (rc)
3182 		return rc;
3183 
3184 	return 0;
3185 }
3186 
3187 static int type_write(void *vkey, void *datum, void *ptr)
3188 {
3189 	char *key = vkey;
3190 	struct type_datum *typdatum = datum;
3191 	struct policy_data *pd = ptr;
3192 	struct policydb *p = pd->p;
3193 	void *fp = pd->fp;
3194 	__le32 buf[4];
3195 	int rc;
3196 	size_t items, len;
3197 
3198 	len = strlen(key);
3199 	items = 0;
3200 	buf[items++] = cpu_to_le32(len);
3201 	buf[items++] = cpu_to_le32(typdatum->value);
3202 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY) {
3203 		u32 properties = 0;
3204 
3205 		if (typdatum->primary)
3206 			properties |= TYPEDATUM_PROPERTY_PRIMARY;
3207 
3208 		if (typdatum->attribute)
3209 			properties |= TYPEDATUM_PROPERTY_ATTRIBUTE;
3210 
3211 		buf[items++] = cpu_to_le32(properties);
3212 		buf[items++] = cpu_to_le32(typdatum->bounds);
3213 	} else {
3214 		buf[items++] = cpu_to_le32(typdatum->primary);
3215 	}
3216 	BUG_ON(items > ARRAY_SIZE(buf));
3217 	rc = put_entry(buf, sizeof(u32), items, fp);
3218 	if (rc)
3219 		return rc;
3220 
3221 	rc = put_entry(key, 1, len, fp);
3222 	if (rc)
3223 		return rc;
3224 
3225 	return 0;
3226 }
3227 
3228 static int user_write(void *vkey, void *datum, void *ptr)
3229 {
3230 	char *key = vkey;
3231 	struct user_datum *usrdatum = datum;
3232 	struct policy_data *pd = ptr;
3233 	struct policydb *p = pd->p;
3234 	void *fp = pd->fp;
3235 	__le32 buf[3];
3236 	size_t items, len;
3237 	int rc;
3238 
3239 	len = strlen(key);
3240 	items = 0;
3241 	buf[items++] = cpu_to_le32(len);
3242 	buf[items++] = cpu_to_le32(usrdatum->value);
3243 	if (p->policyvers >= POLICYDB_VERSION_BOUNDARY)
3244 		buf[items++] = cpu_to_le32(usrdatum->bounds);
3245 	BUG_ON(items > ARRAY_SIZE(buf));
3246 	rc = put_entry(buf, sizeof(u32), items, fp);
3247 	if (rc)
3248 		return rc;
3249 
3250 	rc = put_entry(key, 1, len, fp);
3251 	if (rc)
3252 		return rc;
3253 
3254 	rc = ebitmap_write(&usrdatum->roles, fp);
3255 	if (rc)
3256 		return rc;
3257 
3258 	rc = mls_write_range_helper(&usrdatum->range, fp);
3259 	if (rc)
3260 		return rc;
3261 
3262 	rc = mls_write_level(&usrdatum->dfltlevel, fp);
3263 	if (rc)
3264 		return rc;
3265 
3266 	return 0;
3267 }
3268 
3269 static int (*const write_f[SYM_NUM]) (void *key, void *datum, void *datap) = {
3270 	common_write,
3271 	class_write,
3272 	role_write,
3273 	type_write,
3274 	user_write,
3275 	cond_write_bool,
3276 	sens_write,
3277 	cat_write,
3278 };
3279 
3280 static int ocontext_write(struct policydb *p, const struct policydb_compat_info *info,
3281 			  void *fp)
3282 {
3283 	unsigned int i, j;
3284 	int rc;
3285 	size_t nel, len;
3286 	__be64 prefixbuf[1];
3287 	__le32 buf[3];
3288 	u32 nodebuf[8];
3289 	struct ocontext *c;
3290 	for (i = 0; i < info->ocon_num; i++) {
3291 		nel = 0;
3292 		for (c = p->ocontexts[i]; c; c = c->next)
3293 			nel++;
3294 		buf[0] = cpu_to_le32(nel);
3295 		rc = put_entry(buf, sizeof(u32), 1, fp);
3296 		if (rc)
3297 			return rc;
3298 		for (c = p->ocontexts[i]; c; c = c->next) {
3299 			switch (i) {
3300 			case OCON_ISID:
3301 				buf[0] = cpu_to_le32(c->sid[0]);
3302 				rc = put_entry(buf, sizeof(u32), 1, fp);
3303 				if (rc)
3304 					return rc;
3305 				rc = context_write(p, &c->context[0], fp);
3306 				if (rc)
3307 					return rc;
3308 				break;
3309 			case OCON_FS:
3310 			case OCON_NETIF:
3311 				len = strlen(c->u.name);
3312 				buf[0] = cpu_to_le32(len);
3313 				rc = put_entry(buf, sizeof(u32), 1, fp);
3314 				if (rc)
3315 					return rc;
3316 				rc = put_entry(c->u.name, 1, len, fp);
3317 				if (rc)
3318 					return rc;
3319 				rc = context_write(p, &c->context[0], fp);
3320 				if (rc)
3321 					return rc;
3322 				rc = context_write(p, &c->context[1], fp);
3323 				if (rc)
3324 					return rc;
3325 				break;
3326 			case OCON_PORT:
3327 				buf[0] = cpu_to_le32(c->u.port.protocol);
3328 				buf[1] = cpu_to_le32(c->u.port.low_port);
3329 				buf[2] = cpu_to_le32(c->u.port.high_port);
3330 				rc = put_entry(buf, sizeof(u32), 3, fp);
3331 				if (rc)
3332 					return rc;
3333 				rc = context_write(p, &c->context[0], fp);
3334 				if (rc)
3335 					return rc;
3336 				break;
3337 			case OCON_NODE:
3338 				nodebuf[0] = c->u.node.addr; /* network order */
3339 				nodebuf[1] = c->u.node.mask; /* network order */
3340 				rc = put_entry(nodebuf, sizeof(u32), 2, fp);
3341 				if (rc)
3342 					return rc;
3343 				rc = context_write(p, &c->context[0], fp);
3344 				if (rc)
3345 					return rc;
3346 				break;
3347 			case OCON_FSUSE:
3348 				buf[0] = cpu_to_le32(c->v.behavior);
3349 				len = strlen(c->u.name);
3350 				buf[1] = cpu_to_le32(len);
3351 				rc = put_entry(buf, sizeof(u32), 2, fp);
3352 				if (rc)
3353 					return rc;
3354 				rc = put_entry(c->u.name, 1, len, fp);
3355 				if (rc)
3356 					return rc;
3357 				rc = context_write(p, &c->context[0], fp);
3358 				if (rc)
3359 					return rc;
3360 				break;
3361 			case OCON_NODE6:
3362 				for (j = 0; j < 4; j++)
3363 					nodebuf[j] = c->u.node6.addr[j]; /* network order */
3364 				for (j = 0; j < 4; j++)
3365 					nodebuf[j + 4] = c->u.node6.mask[j]; /* network order */
3366 				rc = put_entry(nodebuf, sizeof(u32), 8, fp);
3367 				if (rc)
3368 					return rc;
3369 				rc = context_write(p, &c->context[0], fp);
3370 				if (rc)
3371 					return rc;
3372 				break;
3373 			case OCON_IBPKEY:
3374 				/* subnet_prefix is in CPU order */
3375 				prefixbuf[0] = cpu_to_be64(c->u.ibpkey.subnet_prefix);
3376 
3377 				rc = put_entry(prefixbuf, sizeof(u64), 1, fp);
3378 				if (rc)
3379 					return rc;
3380 
3381 				buf[0] = cpu_to_le32(c->u.ibpkey.low_pkey);
3382 				buf[1] = cpu_to_le32(c->u.ibpkey.high_pkey);
3383 
3384 				rc = put_entry(buf, sizeof(u32), 2, fp);
3385 				if (rc)
3386 					return rc;
3387 				rc = context_write(p, &c->context[0], fp);
3388 				if (rc)
3389 					return rc;
3390 				break;
3391 			case OCON_IBENDPORT:
3392 				len = strlen(c->u.ibendport.dev_name);
3393 				buf[0] = cpu_to_le32(len);
3394 				buf[1] = cpu_to_le32(c->u.ibendport.port);
3395 				rc = put_entry(buf, sizeof(u32), 2, fp);
3396 				if (rc)
3397 					return rc;
3398 				rc = put_entry(c->u.ibendport.dev_name, 1, len, fp);
3399 				if (rc)
3400 					return rc;
3401 				rc = context_write(p, &c->context[0], fp);
3402 				if (rc)
3403 					return rc;
3404 				break;
3405 			}
3406 		}
3407 	}
3408 	return 0;
3409 }
3410 
3411 static int genfs_write(struct policydb *p, void *fp)
3412 {
3413 	struct genfs *genfs;
3414 	struct ocontext *c;
3415 	size_t len;
3416 	__le32 buf[1];
3417 	int rc;
3418 
3419 	len = 0;
3420 	for (genfs = p->genfs; genfs; genfs = genfs->next)
3421 		len++;
3422 	buf[0] = cpu_to_le32(len);
3423 	rc = put_entry(buf, sizeof(u32), 1, fp);
3424 	if (rc)
3425 		return rc;
3426 	for (genfs = p->genfs; genfs; genfs = genfs->next) {
3427 		len = strlen(genfs->fstype);
3428 		buf[0] = cpu_to_le32(len);
3429 		rc = put_entry(buf, sizeof(u32), 1, fp);
3430 		if (rc)
3431 			return rc;
3432 		rc = put_entry(genfs->fstype, 1, len, fp);
3433 		if (rc)
3434 			return rc;
3435 		len = 0;
3436 		for (c = genfs->head; c; c = c->next)
3437 			len++;
3438 		buf[0] = cpu_to_le32(len);
3439 		rc = put_entry(buf, sizeof(u32), 1, fp);
3440 		if (rc)
3441 			return rc;
3442 		for (c = genfs->head; c; c = c->next) {
3443 			len = strlen(c->u.name);
3444 			buf[0] = cpu_to_le32(len);
3445 			rc = put_entry(buf, sizeof(u32), 1, fp);
3446 			if (rc)
3447 				return rc;
3448 			rc = put_entry(c->u.name, 1, len, fp);
3449 			if (rc)
3450 				return rc;
3451 			buf[0] = cpu_to_le32(c->v.sclass);
3452 			rc = put_entry(buf, sizeof(u32), 1, fp);
3453 			if (rc)
3454 				return rc;
3455 			rc = context_write(p, &c->context[0], fp);
3456 			if (rc)
3457 				return rc;
3458 		}
3459 	}
3460 	return 0;
3461 }
3462 
3463 static int range_write_helper(void *key, void *data, void *ptr)
3464 {
3465 	__le32 buf[2];
3466 	struct range_trans *rt = key;
3467 	struct mls_range *r = data;
3468 	struct policy_data *pd = ptr;
3469 	void *fp = pd->fp;
3470 	struct policydb *p = pd->p;
3471 	int rc;
3472 
3473 	buf[0] = cpu_to_le32(rt->source_type);
3474 	buf[1] = cpu_to_le32(rt->target_type);
3475 	rc = put_entry(buf, sizeof(u32), 2, fp);
3476 	if (rc)
3477 		return rc;
3478 	if (p->policyvers >= POLICYDB_VERSION_RANGETRANS) {
3479 		buf[0] = cpu_to_le32(rt->target_class);
3480 		rc = put_entry(buf, sizeof(u32), 1, fp);
3481 		if (rc)
3482 			return rc;
3483 	}
3484 	rc = mls_write_range_helper(r, fp);
3485 	if (rc)
3486 		return rc;
3487 
3488 	return 0;
3489 }
3490 
3491 static int range_write(struct policydb *p, void *fp)
3492 {
3493 	__le32 buf[1];
3494 	int rc;
3495 	struct policy_data pd;
3496 
3497 	pd.p = p;
3498 	pd.fp = fp;
3499 
3500 	buf[0] = cpu_to_le32(p->range_tr.nel);
3501 	rc = put_entry(buf, sizeof(u32), 1, fp);
3502 	if (rc)
3503 		return rc;
3504 
3505 	/* actually write all of the entries */
3506 	rc = hashtab_map(&p->range_tr, range_write_helper, &pd);
3507 	if (rc)
3508 		return rc;
3509 
3510 	return 0;
3511 }
3512 
3513 static int filename_write_helper_compat(void *key, void *data, void *ptr)
3514 {
3515 	struct filename_trans_key *ft = key;
3516 	struct filename_trans_datum *datum = data;
3517 	struct ebitmap_node *node;
3518 	void *fp = ptr;
3519 	__le32 buf[4];
3520 	int rc;
3521 	u32 bit, len = strlen(ft->name);
3522 
3523 	do {
3524 		ebitmap_for_each_positive_bit(&datum->stypes, node, bit) {
3525 			buf[0] = cpu_to_le32(len);
3526 			rc = put_entry(buf, sizeof(u32), 1, fp);
3527 			if (rc)
3528 				return rc;
3529 
3530 			rc = put_entry(ft->name, sizeof(char), len, fp);
3531 			if (rc)
3532 				return rc;
3533 
3534 			buf[0] = cpu_to_le32(bit + 1);
3535 			buf[1] = cpu_to_le32(ft->ttype);
3536 			buf[2] = cpu_to_le32(ft->tclass);
3537 			buf[3] = cpu_to_le32(datum->otype);
3538 
3539 			rc = put_entry(buf, sizeof(u32), 4, fp);
3540 			if (rc)
3541 				return rc;
3542 		}
3543 
3544 		datum = datum->next;
3545 	} while (unlikely(datum));
3546 
3547 	return 0;
3548 }
3549 
3550 static int filename_write_helper(void *key, void *data, void *ptr)
3551 {
3552 	struct filename_trans_key *ft = key;
3553 	struct filename_trans_datum *datum;
3554 	void *fp = ptr;
3555 	__le32 buf[3];
3556 	int rc;
3557 	u32 ndatum, len = strlen(ft->name);
3558 
3559 	buf[0] = cpu_to_le32(len);
3560 	rc = put_entry(buf, sizeof(u32), 1, fp);
3561 	if (rc)
3562 		return rc;
3563 
3564 	rc = put_entry(ft->name, sizeof(char), len, fp);
3565 	if (rc)
3566 		return rc;
3567 
3568 	ndatum = 0;
3569 	datum = data;
3570 	do {
3571 		ndatum++;
3572 		datum = datum->next;
3573 	} while (unlikely(datum));
3574 
3575 	buf[0] = cpu_to_le32(ft->ttype);
3576 	buf[1] = cpu_to_le32(ft->tclass);
3577 	buf[2] = cpu_to_le32(ndatum);
3578 	rc = put_entry(buf, sizeof(u32), 3, fp);
3579 	if (rc)
3580 		return rc;
3581 
3582 	datum = data;
3583 	do {
3584 		rc = ebitmap_write(&datum->stypes, fp);
3585 		if (rc)
3586 			return rc;
3587 
3588 		buf[0] = cpu_to_le32(datum->otype);
3589 		rc = put_entry(buf, sizeof(u32), 1, fp);
3590 		if (rc)
3591 			return rc;
3592 
3593 		datum = datum->next;
3594 	} while (unlikely(datum));
3595 
3596 	return 0;
3597 }
3598 
3599 static int filename_trans_write(struct policydb *p, void *fp)
3600 {
3601 	__le32 buf[1];
3602 	int rc;
3603 
3604 	if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
3605 		return 0;
3606 
3607 	if (p->policyvers < POLICYDB_VERSION_COMP_FTRANS) {
3608 		buf[0] = cpu_to_le32(p->compat_filename_trans_count);
3609 		rc = put_entry(buf, sizeof(u32), 1, fp);
3610 		if (rc)
3611 			return rc;
3612 
3613 		rc = hashtab_map(&p->filename_trans,
3614 				 filename_write_helper_compat, fp);
3615 	} else {
3616 		buf[0] = cpu_to_le32(p->filename_trans.nel);
3617 		rc = put_entry(buf, sizeof(u32), 1, fp);
3618 		if (rc)
3619 			return rc;
3620 
3621 		rc = hashtab_map(&p->filename_trans, filename_write_helper, fp);
3622 	}
3623 	return rc;
3624 }
3625 
3626 /*
3627  * Write the configuration data in a policy database
3628  * structure to a policy database binary representation
3629  * file.
3630  */
3631 int policydb_write(struct policydb *p, void *fp)
3632 {
3633 	unsigned int num_syms;
3634 	int rc;
3635 	__le32 buf[4];
3636 	u32 config, i;
3637 	size_t len;
3638 	const struct policydb_compat_info *info;
3639 
3640 	/*
3641 	 * refuse to write policy older than compressed avtab
3642 	 * to simplify the writer.  There are other tests dropped
3643 	 * since we assume this throughout the writer code.  Be
3644 	 * careful if you ever try to remove this restriction
3645 	 */
3646 	if (p->policyvers < POLICYDB_VERSION_AVTAB) {
3647 		pr_err("SELinux: refusing to write policy version %d."
3648 		       "  Because it is less than version %d\n", p->policyvers,
3649 		       POLICYDB_VERSION_AVTAB);
3650 		return -EINVAL;
3651 	}
3652 
3653 	config = 0;
3654 	if (p->mls_enabled)
3655 		config |= POLICYDB_CONFIG_MLS;
3656 
3657 	if (p->reject_unknown)
3658 		config |= REJECT_UNKNOWN;
3659 	if (p->allow_unknown)
3660 		config |= ALLOW_UNKNOWN;
3661 
3662 	/* Write the magic number and string identifiers. */
3663 	buf[0] = cpu_to_le32(POLICYDB_MAGIC);
3664 	len = strlen(POLICYDB_STRING);
3665 	buf[1] = cpu_to_le32(len);
3666 	rc = put_entry(buf, sizeof(u32), 2, fp);
3667 	if (rc)
3668 		return rc;
3669 	rc = put_entry(POLICYDB_STRING, 1, len, fp);
3670 	if (rc)
3671 		return rc;
3672 
3673 	/* Write the version, config, and table sizes. */
3674 	info = policydb_lookup_compat(p->policyvers);
3675 	if (!info) {
3676 		pr_err("SELinux: compatibility lookup failed for policy "
3677 		    "version %d\n", p->policyvers);
3678 		return -EINVAL;
3679 	}
3680 
3681 	buf[0] = cpu_to_le32(p->policyvers);
3682 	buf[1] = cpu_to_le32(config);
3683 	buf[2] = cpu_to_le32(info->sym_num);
3684 	buf[3] = cpu_to_le32(info->ocon_num);
3685 
3686 	rc = put_entry(buf, sizeof(u32), 4, fp);
3687 	if (rc)
3688 		return rc;
3689 
3690 	if (p->policyvers >= POLICYDB_VERSION_POLCAP) {
3691 		rc = ebitmap_write(&p->policycaps, fp);
3692 		if (rc)
3693 			return rc;
3694 	}
3695 
3696 	if (p->policyvers >= POLICYDB_VERSION_PERMISSIVE) {
3697 		rc = ebitmap_write(&p->permissive_map, fp);
3698 		if (rc)
3699 			return rc;
3700 	}
3701 
3702 	num_syms = info->sym_num;
3703 	for (i = 0; i < num_syms; i++) {
3704 		struct policy_data pd;
3705 
3706 		pd.fp = fp;
3707 		pd.p = p;
3708 
3709 		buf[0] = cpu_to_le32(p->symtab[i].nprim);
3710 		buf[1] = cpu_to_le32(p->symtab[i].table.nel);
3711 
3712 		rc = put_entry(buf, sizeof(u32), 2, fp);
3713 		if (rc)
3714 			return rc;
3715 		rc = hashtab_map(&p->symtab[i].table, write_f[i], &pd);
3716 		if (rc)
3717 			return rc;
3718 	}
3719 
3720 	rc = avtab_write(p, &p->te_avtab, fp);
3721 	if (rc)
3722 		return rc;
3723 
3724 	rc = cond_write_list(p, fp);
3725 	if (rc)
3726 		return rc;
3727 
3728 	rc = role_trans_write(p, fp);
3729 	if (rc)
3730 		return rc;
3731 
3732 	rc = role_allow_write(p->role_allow, fp);
3733 	if (rc)
3734 		return rc;
3735 
3736 	rc = filename_trans_write(p, fp);
3737 	if (rc)
3738 		return rc;
3739 
3740 	rc = ocontext_write(p, info, fp);
3741 	if (rc)
3742 		return rc;
3743 
3744 	rc = genfs_write(p, fp);
3745 	if (rc)
3746 		return rc;
3747 
3748 	rc = range_write(p, fp);
3749 	if (rc)
3750 		return rc;
3751 
3752 	for (i = 0; i < p->p_types.nprim; i++) {
3753 		struct ebitmap *e = &p->type_attr_map_array[i];
3754 
3755 		rc = ebitmap_write(e, fp);
3756 		if (rc)
3757 			return rc;
3758 	}
3759 
3760 	return 0;
3761 }
3762