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