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