• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  *    1. Redistributions of source code must retain the above copyright notice,
8  *       this list of conditions and the following disclaimer.
9  *
10  *    2. Redistributions in binary form must reproduce the above copyright notice,
11  *       this list of conditions and the following disclaimer in the documentation
12  *       and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
15  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  *
25  * The views and conclusions contained in the software and documentation are those
26  * of the authors and should not be interpreted as representing official policies,
27  * either expressed or implied, of Tresys Technology, LLC.
28  */
29 
30 #ifndef CIL_INTERNAL_H_
31 #define CIL_INTERNAL_H_
32 
33 #include <stdlib.h>
34 #include <stdio.h>
35 #include <stdint.h>
36 #include <arpa/inet.h>
37 
38 #include <sepol/policydb/services.h>
39 #include <sepol/policydb/policydb.h>
40 #include <sepol/policydb/flask_types.h>
41 
42 #include <cil/cil.h>
43 
44 #include "cil_flavor.h"
45 #include "cil_tree.h"
46 #include "cil_symtab.h"
47 #include "cil_mem.h"
48 
49 #define CIL_MAX_NAME_LENGTH 2048
50 
51 #define CIL_DEGENERATE_INHERITANCE_DEPTH 10UL
52 #define CIL_DEGENERATE_INHERITANCE_MINIMUM (0x01 << CIL_DEGENERATE_INHERITANCE_DEPTH)
53 #define CIL_DEGENERATE_INHERITANCE_GROWTH 10UL
54 
55 enum cil_pass {
56 	CIL_PASS_INIT = 0,
57 
58 	CIL_PASS_TIF,
59 	CIL_PASS_IN_BEFORE,
60 	CIL_PASS_BLKIN_LINK,
61 	CIL_PASS_BLKIN_COPY,
62 	CIL_PASS_BLKABS,
63 	CIL_PASS_IN_AFTER,
64 	CIL_PASS_CALL1,
65 	CIL_PASS_CALL2,
66 	CIL_PASS_ALIAS1,
67 	CIL_PASS_ALIAS2,
68 	CIL_PASS_MISC1,
69 	CIL_PASS_MLS,
70 	CIL_PASS_MISC2,
71 	CIL_PASS_MISC3,
72 
73 	CIL_PASS_NUM
74 };
75 
76 
77 /*
78 	Keywords
79 */
80 extern char *CIL_KEY_CONS_T1;
81 extern char *CIL_KEY_CONS_T2;
82 extern char *CIL_KEY_CONS_T3;
83 extern char *CIL_KEY_CONS_R1;
84 extern char *CIL_KEY_CONS_R2;
85 extern char *CIL_KEY_CONS_R3;
86 extern char *CIL_KEY_CONS_U1;
87 extern char *CIL_KEY_CONS_U2;
88 extern char *CIL_KEY_CONS_U3;
89 extern char *CIL_KEY_CONS_L1;
90 extern char *CIL_KEY_CONS_L2;
91 extern char *CIL_KEY_CONS_H1;
92 extern char *CIL_KEY_CONS_H2;
93 extern char *CIL_KEY_AND;
94 extern char *CIL_KEY_OR;
95 extern char *CIL_KEY_NOT;
96 extern char *CIL_KEY_EQ;
97 extern char *CIL_KEY_NEQ;
98 extern char *CIL_KEY_CONS_DOM;
99 extern char *CIL_KEY_CONS_DOMBY;
100 extern char *CIL_KEY_CONS_INCOMP;
101 extern char *CIL_KEY_CONDTRUE;
102 extern char *CIL_KEY_CONDFALSE;
103 extern char *CIL_KEY_SELF;
104 extern char *CIL_KEY_NOTSELF;
105 extern char *CIL_KEY_OTHER;
106 extern char *CIL_KEY_OBJECT_R;
107 extern char *CIL_KEY_STAR;
108 extern char *CIL_KEY_TCP;
109 extern char *CIL_KEY_UDP;
110 extern char *CIL_KEY_DCCP;
111 extern char *CIL_KEY_SCTP;
112 extern char *CIL_KEY_AUDITALLOW;
113 extern char *CIL_KEY_TUNABLEIF;
114 extern char *CIL_KEY_ALLOW;
115 extern char *CIL_KEY_DONTAUDIT;
116 extern char *CIL_KEY_TYPETRANSITION;
117 extern char *CIL_KEY_TYPECHANGE;
118 extern char *CIL_KEY_CALL;
119 extern char *CIL_KEY_TUNABLE;
120 extern char *CIL_KEY_XOR;
121 extern char *CIL_KEY_ALL;
122 extern char *CIL_KEY_RANGE;
123 extern char *CIL_KEY_GLOB;
124 extern char *CIL_KEY_FILE;
125 extern char *CIL_KEY_DIR;
126 extern char *CIL_KEY_CHAR;
127 extern char *CIL_KEY_BLOCK;
128 extern char *CIL_KEY_SOCKET;
129 extern char *CIL_KEY_PIPE;
130 extern char *CIL_KEY_SYMLINK;
131 extern char *CIL_KEY_ANY;
132 extern char *CIL_KEY_XATTR;
133 extern char *CIL_KEY_TASK;
134 extern char *CIL_KEY_TRANS;
135 extern char *CIL_KEY_TYPE;
136 extern char *CIL_KEY_ROLE;
137 extern char *CIL_KEY_USER;
138 extern char *CIL_KEY_USERATTRIBUTE;
139 extern char *CIL_KEY_USERATTRIBUTESET;
140 extern char *CIL_KEY_SENSITIVITY;
141 extern char *CIL_KEY_CATEGORY;
142 extern char *CIL_KEY_CATSET;
143 extern char *CIL_KEY_LEVEL;
144 extern char *CIL_KEY_LEVELRANGE;
145 extern char *CIL_KEY_CLASS;
146 extern char *CIL_KEY_IPADDR;
147 extern char *CIL_KEY_MAP_CLASS;
148 extern char *CIL_KEY_CLASSPERMISSION;
149 extern char *CIL_KEY_BOOL;
150 extern char *CIL_KEY_STRING;
151 extern char *CIL_KEY_NAME;
152 extern char *CIL_KEY_SOURCE;
153 extern char *CIL_KEY_TARGET;
154 extern char *CIL_KEY_LOW;
155 extern char *CIL_KEY_HIGH;
156 extern char *CIL_KEY_LOW_HIGH;
157 extern char *CIL_KEY_GLBLUB;
158 extern char *CIL_KEY_HANDLEUNKNOWN;
159 extern char *CIL_KEY_HANDLEUNKNOWN_ALLOW;
160 extern char *CIL_KEY_HANDLEUNKNOWN_DENY;
161 extern char *CIL_KEY_HANDLEUNKNOWN_REJECT;
162 extern char *CIL_KEY_MACRO;
163 extern char *CIL_KEY_IN;
164 extern char *CIL_KEY_IN_BEFORE;
165 extern char *CIL_KEY_IN_AFTER;
166 extern char *CIL_KEY_MLS;
167 extern char *CIL_KEY_DEFAULTRANGE;
168 extern char *CIL_KEY_BLOCKINHERIT;
169 extern char *CIL_KEY_BLOCKABSTRACT;
170 extern char *CIL_KEY_CLASSORDER;
171 extern char *CIL_KEY_CLASSMAPPING;
172 extern char *CIL_KEY_CLASSPERMISSIONSET;
173 extern char *CIL_KEY_COMMON;
174 extern char *CIL_KEY_CLASSCOMMON;
175 extern char *CIL_KEY_SID;
176 extern char *CIL_KEY_SIDCONTEXT;
177 extern char *CIL_KEY_SIDORDER;
178 extern char *CIL_KEY_USERLEVEL;
179 extern char *CIL_KEY_USERRANGE;
180 extern char *CIL_KEY_USERBOUNDS;
181 extern char *CIL_KEY_USERPREFIX;
182 extern char *CIL_KEY_SELINUXUSER;
183 extern char *CIL_KEY_SELINUXUSERDEFAULT;
184 extern char *CIL_KEY_TYPEATTRIBUTE;
185 extern char *CIL_KEY_TYPEATTRIBUTESET;
186 extern char *CIL_KEY_EXPANDTYPEATTRIBUTE;
187 extern char *CIL_KEY_TYPEALIAS;
188 extern char *CIL_KEY_TYPEALIASACTUAL;
189 extern char *CIL_KEY_TYPEBOUNDS;
190 extern char *CIL_KEY_TYPEPERMISSIVE;
191 extern char *CIL_KEY_RANGETRANSITION;
192 extern char *CIL_KEY_USERROLE;
193 extern char *CIL_KEY_ROLETYPE;
194 extern char *CIL_KEY_ROLETRANSITION;
195 extern char *CIL_KEY_ROLEALLOW;
196 extern char *CIL_KEY_ROLEATTRIBUTE;
197 extern char *CIL_KEY_ROLEATTRIBUTESET;
198 extern char *CIL_KEY_ROLEBOUNDS;
199 extern char *CIL_KEY_BOOLEANIF;
200 extern char *CIL_KEY_NEVERALLOW;
201 extern char *CIL_KEY_TYPEMEMBER;
202 extern char *CIL_KEY_SENSALIAS;
203 extern char *CIL_KEY_SENSALIASACTUAL;
204 extern char *CIL_KEY_CATALIAS;
205 extern char *CIL_KEY_CATALIASACTUAL;
206 extern char *CIL_KEY_CATORDER;
207 extern char *CIL_KEY_SENSITIVITYORDER;
208 extern char *CIL_KEY_SENSCAT;
209 extern char *CIL_KEY_CONSTRAIN;
210 extern char *CIL_KEY_MLSCONSTRAIN;
211 extern char *CIL_KEY_VALIDATETRANS;
212 extern char *CIL_KEY_MLSVALIDATETRANS;
213 extern char *CIL_KEY_CONTEXT;
214 extern char *CIL_KEY_FILECON;
215 extern char *CIL_KEY_IBPKEYCON;
216 extern char *CIL_KEY_IBENDPORTCON;
217 extern char *CIL_KEY_PORTCON;
218 extern char *CIL_KEY_NODECON;
219 extern char *CIL_KEY_GENFSCON;
220 extern char *CIL_KEY_NETIFCON;
221 extern char *CIL_KEY_PIRQCON;
222 extern char *CIL_KEY_IOMEMCON;
223 extern char *CIL_KEY_IOPORTCON;
224 extern char *CIL_KEY_PCIDEVICECON;
225 extern char *CIL_KEY_DEVICETREECON;
226 extern char *CIL_KEY_FSUSE;
227 extern char *CIL_KEY_POLICYCAP;
228 extern char *CIL_KEY_OPTIONAL;
229 extern char *CIL_KEY_DEFAULTUSER;
230 extern char *CIL_KEY_DEFAULTROLE;
231 extern char *CIL_KEY_DEFAULTTYPE;
232 extern char *CIL_KEY_ROOT;
233 extern char *CIL_KEY_NODE;
234 extern char *CIL_KEY_PERM;
235 extern char *CIL_KEY_ALLOWX;
236 extern char *CIL_KEY_AUDITALLOWX;
237 extern char *CIL_KEY_DONTAUDITX;
238 extern char *CIL_KEY_NEVERALLOWX;
239 extern char *CIL_KEY_PERMISSIONX;
240 extern char *CIL_KEY_IOCTL;
241 extern char *CIL_KEY_UNORDERED;
242 extern char *CIL_KEY_SRC_INFO;
243 extern char *CIL_KEY_SRC_CIL;
244 extern char *CIL_KEY_SRC_HLL_LMS;
245 extern char *CIL_KEY_SRC_HLL_LMX;
246 extern char *CIL_KEY_SRC_HLL_LME;
247 extern char *CIL_KEY_DENY_RULE;
248 
249 /*
250 	Symbol Table Array Indices
251 */
252 enum cil_sym_index {
253 	CIL_SYM_BLOCKS = 0,
254 	CIL_SYM_USERS,
255 	CIL_SYM_ROLES,
256 	CIL_SYM_TYPES,
257 	CIL_SYM_COMMONS,
258 	CIL_SYM_CLASSES,
259 	CIL_SYM_CLASSPERMSETS,
260 	CIL_SYM_BOOLS,
261 	CIL_SYM_TUNABLES,
262 	CIL_SYM_SENS,
263 	CIL_SYM_CATS,
264 	CIL_SYM_SIDS,
265 	CIL_SYM_CONTEXTS,
266 	CIL_SYM_LEVELS,
267 	CIL_SYM_LEVELRANGES,
268 	CIL_SYM_POLICYCAPS,
269 	CIL_SYM_IPADDRS,
270 	CIL_SYM_STRINGS,
271 	CIL_SYM_PERMX,
272 	CIL_SYM_NUM,
273 	CIL_SYM_UNKNOWN,
274 	CIL_SYM_PERMS	// Special case for permissions. This symtab is not included in arrays
275 };
276 
277 enum cil_sym_array {
278 	CIL_SYM_ARRAY_ROOT = 0,
279 	CIL_SYM_ARRAY_BLOCK,
280 	CIL_SYM_ARRAY_IN,
281 	CIL_SYM_ARRAY_MACRO,
282 	CIL_SYM_ARRAY_CONDBLOCK,
283 	CIL_SYM_ARRAY_NUM
284 };
285 
286 extern const int cil_sym_sizes[CIL_SYM_ARRAY_NUM][CIL_SYM_NUM];
287 
288 #define CIL_CLASS_SYM_SIZE	256
289 #define CIL_PERMS_PER_CLASS (sizeof(sepol_access_vector_t) * 8)
290 
291 struct cil_db {
292 	struct cil_tree *parse;
293 	struct cil_tree *ast;
294 	struct cil_type *selftype;
295 	struct cil_type *notselftype;
296 	struct cil_type *othertype;
297 	struct cil_list *sidorder;
298 	struct cil_list *classorder;
299 	struct cil_list *catorder;
300 	struct cil_list *sensitivityorder;
301 	struct cil_sort *netifcon;
302 	struct cil_sort *genfscon;
303 	struct cil_sort *filecon;
304 	struct cil_sort *nodecon;
305 	struct cil_sort *ibpkeycon;
306 	struct cil_sort *ibendportcon;
307 	struct cil_sort *portcon;
308 	struct cil_sort *pirqcon;
309 	struct cil_sort *iomemcon;
310 	struct cil_sort *ioportcon;
311 	struct cil_sort *pcidevicecon;
312 	struct cil_sort *devicetreecon;
313 	struct cil_sort *fsuse;
314 	struct cil_list *userprefixes;
315 	struct cil_list *selinuxusers;
316 	struct cil_list *declared_strings;
317 	int num_types_and_attrs;
318 	int num_classes;
319 	int num_cats;
320 	int num_types;
321 	int num_roles;
322 	int num_users;
323 	struct cil_type **val_to_type;
324 	struct cil_role **val_to_role;
325 	struct cil_user **val_to_user;
326 	int disable_dontaudit;
327 	int disable_neverallow;
328 	int attrs_expand_generated;
329 	unsigned attrs_expand_size;
330 	int preserve_tunables;
331 	int handle_unknown;
332 	int mls;
333 	int multiple_decls;
334 	int qualified_names;
335 	int target_platform;
336 	int policy_version;
337 };
338 
339 struct cil_root {
340 	symtab_t symtab[CIL_SYM_NUM];
341 };
342 
343 struct cil_sort {
344 	enum cil_flavor flavor;
345 	uint32_t count;
346 	uint32_t index;
347 	void **array;
348 };
349 
350 struct cil_ordered {
351 	int merged;
352 	struct cil_list *strs;
353 	struct cil_list *datums;
354 };
355 
356 struct cil_block {
357 	struct cil_symtab_datum datum;
358 	symtab_t symtab[CIL_SYM_NUM];
359 	uint16_t is_abstract;
360 	struct cil_list *bi_nodes;
361 };
362 
363 struct cil_blockinherit {
364 	char *block_str;
365 	struct cil_block *block;
366 };
367 
368 struct cil_blockabstract {
369 	char *block_str;
370 	struct cil_block *block;
371 };
372 
373 struct cil_in {
374 	symtab_t symtab[CIL_SYM_NUM];
375 	int is_after;
376 	char *block_str;
377 	struct cil_block *block;
378 };
379 
380 struct cil_optional {
381 	struct cil_symtab_datum datum;
382 };
383 
384 struct cil_perm {
385 	struct cil_symtab_datum datum;
386 	unsigned int value;
387 	struct cil_list *classperms; /* Only used for map perms */
388 };
389 
390 struct cil_class {
391 	struct cil_symtab_datum datum;
392 	symtab_t perms;
393 	unsigned int num_perms;
394 	struct cil_class *common; /* Only used for kernel class */
395 	uint32_t ordered; /* Only used for kernel class */
396 };
397 
398 struct cil_classperms_set {
399 	char *set_str;
400 	struct cil_classpermission *set;
401 };
402 
403 struct cil_classperms {
404 	char *class_str;
405 	struct cil_class *class;
406 	struct cil_list *perm_strs;
407 	struct cil_list *perms;
408 };
409 
410 struct cil_classpermission {
411 	struct cil_symtab_datum datum;
412 	struct cil_list *classperms;
413 };
414 
415 struct cil_classpermissionset {
416 	char *set_str;
417 	struct cil_classpermission *set;
418 	struct cil_list *classperms;
419 };
420 
421 struct cil_classmapping {
422 	char *map_class_str;
423 	struct cil_class *map_class;
424 	char *map_perm_str;
425 	struct cil_perm *map_perm;
426 	struct cil_list *classperms;
427 };
428 
429 struct cil_classcommon {
430 	char *class_str;
431 	struct cil_class *class;
432 	char *common_str;
433 	struct cil_class *common;
434 };
435 
436 struct cil_alias {
437 	struct cil_symtab_datum datum;
438 	void *actual;
439 };
440 
441 struct cil_aliasactual {
442 	char *alias_str;
443 	void *alias;
444 	char *actual_str;
445 	void *actual;
446 };
447 
448 struct cil_sid {
449 	struct cil_symtab_datum datum;
450 	struct cil_context *context;
451 	uint32_t ordered;
452 };
453 
454 struct cil_sidcontext {
455 	char *sid_str;
456 	struct cil_sid *sid;
457 	char *context_str;
458 	struct cil_context *context;
459 };
460 
461 struct cil_user {
462 	struct cil_symtab_datum datum;
463 	struct cil_user *bounds;
464 	ebitmap_t *roles;
465 	struct cil_level *dftlevel;
466 	struct cil_levelrange *range;
467 	int value;
468 };
469 
470 struct cil_userattribute {
471 	struct cil_symtab_datum datum;
472 	struct cil_list *expr_list;
473 	ebitmap_t *users;
474 };
475 
476 struct cil_userattributeset {
477 	char *attr_str;
478 	struct cil_userattribute *attr;
479 	struct cil_list *str_expr;
480 	struct cil_list *datum_expr;
481 };
482 
483 struct cil_userrole {
484 	char *user_str;
485 	void *user;
486 	char *role_str;
487 	void *role;
488 };
489 
490 struct cil_userlevel {
491 	char *user_str;
492 	void *user;
493 	char *level_str;
494 	struct cil_level *level;
495 };
496 
497 struct cil_userrange {
498 	char *user_str;
499 	void *user;
500 	char *range_str;
501 	struct cil_levelrange *range;
502 };
503 
504 struct cil_userprefix {
505 	char *user_str;
506 	struct cil_user *user;
507 	char *prefix_str;
508 };
509 
510 struct cil_selinuxuser {
511 	char *name_str;
512 	char *user_str;
513 	struct cil_user *user;
514 	char *range_str;
515 	struct cil_levelrange *range;
516 };
517 
518 struct cil_role {
519 	struct cil_symtab_datum datum;
520 	struct cil_role *bounds;
521 	ebitmap_t *types;
522 	int value;
523 };
524 
525 struct cil_roleattribute {
526 	struct cil_symtab_datum datum;
527 	struct cil_list *expr_list;
528 	ebitmap_t *roles;
529 };
530 
531 struct cil_roleattributeset {
532 	char *attr_str;
533 	struct cil_roleattribute *attr;
534 	struct cil_list *str_expr;
535 	struct cil_list *datum_expr;
536 };
537 
538 struct cil_roletype {
539 	char *role_str;
540 	void *role; /* role or attribute */
541 	char *type_str;
542 	void *type; /* type, alias, or attribute */
543 };
544 
545 struct cil_type	{
546 	struct cil_symtab_datum datum;
547 	struct cil_type *bounds;
548 	int value;
549 };
550 
551 #define CIL_ATTR_AVRULE		(1 << 0)
552 #define CIL_ATTR_NEVERALLOW	(1 << 1)
553 #define CIL_ATTR_CONSTRAINT	(1 << 2)
554 #define CIL_ATTR_EXPAND_TRUE	(1 << 3)
555 #define CIL_ATTR_EXPAND_FALSE	(1 << 4)
556 struct cil_typeattribute {
557 	struct cil_symtab_datum datum;
558 	struct cil_list *expr_list;
559 	ebitmap_t *types;
560 	int used;	// whether or not this attribute was used in a binary policy rule
561 	int keep;
562 };
563 
564 struct cil_typeattributeset {
565 	char *attr_str;
566 	struct cil_typeattribute *attr;
567 	struct cil_list *str_expr;
568 	struct cil_list *datum_expr;
569 };
570 
571 struct cil_expandtypeattribute {
572 	struct cil_list *attr_strs;
573 	struct cil_list *attr_datums;
574 	int expand;
575 };
576 
577 struct cil_typepermissive {
578 	char *type_str;
579 	void *type; /* type or alias */
580 };
581 
582 struct cil_nametypetransition {
583 	char *src_str;
584 	void *src; /* type, alias, or attribute */
585 	char *tgt_str;
586 	void *tgt; /* type, alias, or attribute */
587 	char *obj_str;
588 	struct cil_class *obj;
589 	char *name_str;
590 	struct cil_symtab_datum *name;
591 	char *result_str;
592 	void *result; /* type or alias */
593 
594 };
595 
596 struct cil_rangetransition {
597 	char *src_str;
598 	void *src; /* type, alias, or attribute */
599 	char *exec_str;
600 	void *exec; /* type, alias, or attribute */
601 	char *obj_str;
602 	struct cil_class *obj;
603 	char *range_str;
604 	struct cil_levelrange *range;
605 };
606 
607 struct cil_bool {
608 	struct cil_symtab_datum datum;
609 	uint16_t value;
610 };
611 
612 struct cil_tunable {
613 	struct cil_symtab_datum datum;
614 	uint16_t value;
615 };
616 
617 #define CIL_AVRULE_ALLOWED     1
618 #define CIL_AVRULE_AUDITALLOW  2
619 #define CIL_AVRULE_DONTAUDIT   8
620 #define CIL_AVRULE_NEVERALLOW 128
621 #define CIL_AVRULE_AV         (AVRULE_ALLOWED | AVRULE_AUDITALLOW | AVRULE_DONTAUDIT | AVRULE_NEVERALLOW)
622 struct cil_avrule {
623 	int is_extended;
624 	uint32_t rule_kind;
625 	char *src_str;
626 	void *src; /* type, alias, or attribute */
627 	char *tgt_str;
628 	void *tgt; /* type, alias, or attribute */
629 	union {
630 		struct cil_list *classperms;
631 		struct {
632 			char *permx_str;
633 			struct cil_permissionx *permx;
634 		} x;
635 	} perms;
636 };
637 
638 #define CIL_PERMX_KIND_IOCTL 1
639 struct cil_permissionx {
640 	struct cil_symtab_datum datum;
641 	uint32_t kind;
642 	char *obj_str;
643 	struct cil_class *obj;
644 	struct cil_list *expr_str;
645 	ebitmap_t *perms;
646 };
647 
648 struct cil_deny_rule {
649 	char *src_str;
650 	void *src; /* type, alias, or attribute */
651 	char *tgt_str;
652 	void *tgt; /* type, alias, or attribute */
653 	struct cil_list *classperms;
654 };
655 
656 #define CIL_TYPE_TRANSITION 16
657 #define CIL_TYPE_MEMBER     32
658 #define CIL_TYPE_CHANGE     64
659 #define CIL_AVRULE_TYPE       (AVRULE_TRANSITION | AVRULE_MEMBER | AVRULE_CHANGE)
660 struct cil_type_rule {
661 	uint32_t rule_kind;
662 	char *src_str;
663 	void *src; /* type, alias, or attribute */
664 	char *tgt_str;
665 	void *tgt; /* type, alias, or attribute */
666 	char *obj_str;
667 	struct cil_class *obj;
668 	char *result_str;
669 	void *result; /* type or alias */
670 };
671 
672 struct cil_roletransition {
673 	char *src_str;
674 	struct cil_role *src;
675 	char *tgt_str;
676 	void *tgt; /* type, alias, or attribute */
677 	char *obj_str;
678 	struct cil_class *obj;
679 	char *result_str;
680 	struct cil_role *result;
681 };
682 
683 struct cil_roleallow {
684 	char *src_str;
685 	void *src; /* role or attribute */
686 	char *tgt_str;
687 	void *tgt; /* role or attribute */
688 };
689 
690 struct cil_sens {
691 	struct cil_symtab_datum datum;
692 	struct cil_list *cats_list;
693 	uint32_t ordered;
694 };
695 
696 struct cil_cat {
697 	struct cil_symtab_datum datum;
698 	uint32_t ordered;
699 	int value;
700 };
701 
702 struct cil_cats {
703 	uint32_t evaluated;
704 	struct cil_list *str_expr;
705 	struct cil_list *datum_expr;
706 };
707 
708 struct cil_catset {
709 	struct cil_symtab_datum datum;
710 	struct cil_cats *cats;
711 };
712 
713 struct cil_senscat {
714 	char *sens_str;
715 	struct cil_sens *sens;
716 	struct cil_cats *cats;
717 };
718 
719 struct cil_level {
720 	struct cil_symtab_datum datum;
721 	char *sens_str;
722 	struct cil_sens *sens;
723 	struct cil_cats *cats;
724 };
725 
726 struct cil_levelrange {
727 	struct cil_symtab_datum datum;
728 	char *low_str;
729 	struct cil_level *low;
730 	char *high_str;
731 	struct cil_level *high;
732 };
733 
734 struct cil_context {
735 	struct cil_symtab_datum datum;
736 	char *user_str;
737 	struct cil_user *user;
738 	char *role_str;
739 	struct cil_role *role;
740 	char *type_str;
741 	void *type; /* type or alias */
742 	char *range_str;
743 	struct cil_levelrange *range;
744 };
745 
746 enum cil_filecon_types {
747 	CIL_FILECON_ANY = 0,
748 	CIL_FILECON_FILE,
749 	CIL_FILECON_DIR,
750 	CIL_FILECON_CHAR,
751 	CIL_FILECON_BLOCK,
752 	CIL_FILECON_SOCKET,
753 	CIL_FILECON_PIPE,
754 	CIL_FILECON_SYMLINK,
755 };
756 
757 struct cil_filecon {
758 	char *path_str;
759 	struct cil_symtab_datum *path;
760 	enum cil_filecon_types type;
761 	char *context_str;
762 	struct cil_context *context;
763 };
764 
765 enum cil_protocol {
766 	CIL_PROTOCOL_UDP = 1,
767 	CIL_PROTOCOL_TCP,
768 	CIL_PROTOCOL_DCCP,
769 	CIL_PROTOCOL_SCTP
770 };
771 
772 struct cil_ibpkeycon {
773 	char *subnet_prefix_str;
774 	uint32_t pkey_low;
775 	uint32_t pkey_high;
776 	char *context_str;
777 	struct cil_context *context;
778 };
779 
780 struct cil_portcon {
781 	enum cil_protocol proto;
782 	uint32_t port_low;
783 	uint32_t port_high;
784 	char *context_str;
785 	struct cil_context *context;
786 };
787 
788 struct cil_nodecon {
789 	char *addr_str;
790 	struct cil_ipaddr *addr;
791 	char *mask_str;
792 	struct cil_ipaddr *mask;
793 	char *context_str;
794 	struct cil_context *context;
795 };
796 
797 struct cil_ipaddr {
798 	struct cil_symtab_datum datum;
799 	int family;
800 	union {
801 		struct in_addr v4;
802 		struct in6_addr v6;
803 	} ip;
804 };
805 
806 struct cil_genfscon {
807 	char *fs_str;
808 	char *path_str;
809 	enum cil_filecon_types file_type;
810 	char *context_str;
811 	struct cil_context *context;
812 };
813 
814 struct cil_netifcon {
815 	char *interface_str;
816 	char *if_context_str;
817 	struct cil_context *if_context;
818 	char *packet_context_str;
819 	struct cil_context *packet_context;
820 	char *context_str;
821 };
822 
823 struct cil_ibendportcon {
824 	char *dev_name_str;
825 	uint32_t port;
826 	char *context_str;
827 	struct cil_context *context;
828 };
829 struct cil_pirqcon {
830 	uint32_t pirq;
831 	char *context_str;
832 	struct cil_context *context;
833 };
834 
835 struct cil_iomemcon {
836 	uint64_t iomem_low;
837 	uint64_t iomem_high;
838 	char *context_str;
839 	struct cil_context *context;
840 };
841 
842 struct cil_ioportcon {
843 	uint32_t ioport_low;
844 	uint32_t ioport_high;
845 	char *context_str;
846 	struct cil_context *context;
847 };
848 
849 struct cil_pcidevicecon {
850 	uint32_t dev;
851 	char *context_str;
852 	struct cil_context *context;
853 };
854 
855 struct cil_devicetreecon {
856 	char *path;
857 	char *context_str;
858 	struct cil_context *context;
859 };
860 
861 
862 /* Ensure that CIL uses the same values as sepol services.h */
863 enum cil_fsuse_types {
864 	CIL_FSUSE_XATTR = SECURITY_FS_USE_XATTR,
865 	CIL_FSUSE_TASK = SECURITY_FS_USE_TASK,
866 	CIL_FSUSE_TRANS = SECURITY_FS_USE_TRANS
867 };
868 
869 struct cil_fsuse {
870 	enum cil_fsuse_types type;
871 	char *fs_str;
872 	char *context_str;
873 	struct cil_context *context;
874 };
875 
876 #define CIL_MLS_LEVELS "l1 l2 h1 h2"
877 #define CIL_CONSTRAIN_KEYS "t1 t2 r1 r2 u1 u2"
878 #define CIL_MLSCONSTRAIN_KEYS CIL_MLS_LEVELS CIL_CONSTRAIN_KEYS
879 #define CIL_CONSTRAIN_OPER "== != eq dom domby incomp not and or"
880 struct cil_constrain {
881 	struct cil_list *classperms;
882 	struct cil_list *str_expr;
883 	struct cil_list *datum_expr;
884 };
885 
886 struct cil_validatetrans {
887 	char *class_str;
888 	struct cil_class *class;
889 	struct cil_list *str_expr;
890 	struct cil_list *datum_expr;
891 };
892 
893 struct cil_param {
894 	char *str;
895 	enum cil_flavor flavor;
896 };
897 
898 struct cil_macro {
899 	struct cil_symtab_datum datum;
900 	symtab_t symtab[CIL_SYM_NUM];
901 	struct cil_list *params;
902 };
903 
904 struct cil_args {
905 	char *arg_str;
906 	struct cil_symtab_datum *arg;
907 	char *param_str;
908 	enum cil_flavor flavor;
909 };
910 
911 struct cil_call {
912 	char *macro_str;
913 	struct cil_macro *macro;
914 	struct cil_tree *args_tree;
915 	struct cil_list *args;
916 	int copied;
917 };
918 
919 #define CIL_TRUE	1
920 #define CIL_FALSE	0
921 
922 struct cil_condblock {
923 	enum cil_flavor flavor;
924 	symtab_t symtab[CIL_SYM_NUM];
925 };
926 
927 struct cil_booleanif {
928 	struct cil_list *str_expr;
929 	struct cil_list *datum_expr;
930 	int preserved_tunable;
931 };
932 
933 struct cil_tunableif {
934 	struct cil_list *str_expr;
935 	struct cil_list *datum_expr;
936 };
937 
938 struct cil_policycap {
939 	struct cil_symtab_datum datum;
940 };
941 
942 struct cil_bounds {
943 	char *parent_str;
944 	void *parent;
945 	char *child_str;
946 	void *child;
947 };
948 
949 /* Ensure that CIL uses the same values as sepol policydb.h */
950 enum cil_default_object {
951 	CIL_DEFAULT_SOURCE = DEFAULT_SOURCE,
952 	CIL_DEFAULT_TARGET = DEFAULT_TARGET,
953 };
954 
955 /* Default labeling behavior for users, roles, and types */
956 struct cil_default {
957 	enum cil_flavor flavor;
958 	struct cil_list *class_strs;
959 	struct cil_list *class_datums;
960 	enum cil_default_object object;
961 };
962 
963 /* Ensure that CIL uses the same values as sepol policydb.h */
964 enum cil_default_object_range {
965 	CIL_DEFAULT_SOURCE_LOW      = DEFAULT_SOURCE_LOW,
966 	CIL_DEFAULT_SOURCE_HIGH     = DEFAULT_SOURCE_HIGH,
967 	CIL_DEFAULT_SOURCE_LOW_HIGH = DEFAULT_SOURCE_LOW_HIGH,
968 	CIL_DEFAULT_TARGET_LOW      = DEFAULT_TARGET_LOW,
969 	CIL_DEFAULT_TARGET_HIGH     = DEFAULT_TARGET_HIGH,
970 	CIL_DEFAULT_TARGET_LOW_HIGH = DEFAULT_TARGET_LOW_HIGH,
971 	CIL_DEFAULT_GLBLUB          = DEFAULT_GLBLUB,
972 };
973 
974 /* Default labeling behavior for range */
975 struct cil_defaultrange {
976 	struct cil_list *class_strs;
977 	struct cil_list *class_datums;
978 	enum cil_default_object_range object_range;
979 };
980 
981 struct cil_handleunknown {
982 	int handle_unknown;
983 };
984 
985 struct cil_mls {
986 	int value;
987 };
988 
989 struct cil_src_info {
990 	char *kind;
991 	uint32_t hll_line;
992 	char *path;
993 };
994 
995 void cil_db_init(struct cil_db **db);
996 void cil_db_destroy(struct cil_db **db);
997 
998 void cil_root_init(struct cil_root **root);
999 void cil_root_destroy(struct cil_root *root);
1000 
1001 void cil_destroy_data(void **data, enum cil_flavor flavor);
1002 
1003 int cil_flavor_to_symtab_index(enum cil_flavor flavor, enum cil_sym_index *index);
1004 const char * cil_node_to_string(struct cil_tree_node *node);
1005 
1006 int cil_userprefixes_to_string(struct cil_db *db, char **out, size_t *size);
1007 int cil_selinuxusers_to_string(struct cil_db *db, char **out, size_t *size);
1008 int cil_filecons_to_string(struct cil_db *db, char **out, size_t *size);
1009 
1010 void cil_symtab_array_init(symtab_t symtab[], const int symtab_sizes[CIL_SYM_NUM]);
1011 void cil_symtab_array_destroy(symtab_t symtab[]);
1012 void cil_destroy_ast_symtabs(struct cil_tree_node *root);
1013 int cil_get_symtab(struct cil_tree_node *ast_node, symtab_t **symtab, enum cil_sym_index sym_index);
1014 int cil_string_to_uint32(const char *string, uint32_t *value, int base);
1015 int cil_string_to_uint64(const char *string, uint64_t *value, int base);
1016 
1017 void cil_sort_init(struct cil_sort **sort);
1018 void cil_sort_destroy(struct cil_sort **sort);
1019 void cil_ordered_init(struct cil_ordered **ordered);
1020 void cil_netifcon_init(struct cil_netifcon **netifcon);
1021 void cil_ibendportcon_init(struct cil_ibendportcon **ibendportcon);
1022 void cil_context_init(struct cil_context **context);
1023 void cil_level_init(struct cil_level **level);
1024 void cil_levelrange_init(struct cil_levelrange **lvlrange);
1025 void cil_sens_init(struct cil_sens **sens);
1026 void cil_block_init(struct cil_block **block);
1027 void cil_blockinherit_init(struct cil_blockinherit **inherit);
1028 void cil_blockabstract_init(struct cil_blockabstract **abstract);
1029 void cil_in_init(struct cil_in **in);
1030 void cil_class_init(struct cil_class **class);
1031 void cil_classcommon_init(struct cil_classcommon **classcommon);
1032 void cil_sid_init(struct cil_sid **sid);
1033 void cil_sidcontext_init(struct cil_sidcontext **sidcontext);
1034 void cil_userrole_init(struct cil_userrole **userrole);
1035 void cil_userprefix_init(struct cil_userprefix **userprefix);
1036 void cil_selinuxuser_init(struct cil_selinuxuser **selinuxuser);
1037 void cil_roleattribute_init(struct cil_roleattribute **attribute);
1038 void cil_roleattributeset_init(struct cil_roleattributeset **attrset);
1039 void cil_roletype_init(struct cil_roletype **roletype);
1040 void cil_typeattribute_init(struct cil_typeattribute **attribute);
1041 void cil_typeattributeset_init(struct cil_typeattributeset **attrset);
1042 void cil_expandtypeattribute_init(struct cil_expandtypeattribute **expandattr);
1043 void cil_alias_init(struct cil_alias **alias);
1044 void cil_aliasactual_init(struct cil_aliasactual **aliasactual);
1045 void cil_typepermissive_init(struct cil_typepermissive **typeperm);
1046 void cil_nametypetransition_init(struct cil_nametypetransition **nametypetrans);
1047 void cil_rangetransition_init(struct cil_rangetransition **rangetrans);
1048 void cil_bool_init(struct cil_bool **cilbool);
1049 void cil_boolif_init(struct cil_booleanif **bif);
1050 void cil_condblock_init(struct cil_condblock **cb);
1051 void cil_tunable_init(struct cil_tunable **ciltun);
1052 void cil_tunif_init(struct cil_tunableif **tif);
1053 void cil_avrule_init(struct cil_avrule **avrule);
1054 void cil_permissionx_init(struct cil_permissionx **permx);
1055 void cil_deny_rule_init(struct cil_deny_rule **rule);
1056 void cil_type_rule_init(struct cil_type_rule **type_rule);
1057 void cil_roletransition_init(struct cil_roletransition **roletrans);
1058 void cil_roleallow_init(struct cil_roleallow **role_allow);
1059 void cil_catset_init(struct cil_catset **catset);
1060 void cil_cats_init(struct cil_cats **cats);
1061 void cil_senscat_init(struct cil_senscat **senscat);
1062 void cil_filecon_init(struct cil_filecon **filecon);
1063 void cil_ibpkeycon_init(struct cil_ibpkeycon **ibpkeycon);
1064 void cil_portcon_init(struct cil_portcon **portcon);
1065 void cil_nodecon_init(struct cil_nodecon **nodecon);
1066 void cil_genfscon_init(struct cil_genfscon **genfscon);
1067 void cil_pirqcon_init(struct cil_pirqcon **pirqcon);
1068 void cil_iomemcon_init(struct cil_iomemcon **iomemcon);
1069 void cil_ioportcon_init(struct cil_ioportcon **ioportcon);
1070 void cil_pcidevicecon_init(struct cil_pcidevicecon **pcidevicecon);
1071 void cil_devicetreecon_init(struct cil_devicetreecon **devicetreecon);
1072 void cil_fsuse_init(struct cil_fsuse **fsuse);
1073 void cil_constrain_init(struct cil_constrain **constrain);
1074 void cil_validatetrans_init(struct cil_validatetrans **validtrans);
1075 void cil_ipaddr_init(struct cil_ipaddr **ipaddr);
1076 void cil_perm_init(struct cil_perm **perm);
1077 void cil_classpermission_init(struct cil_classpermission **cp);
1078 void cil_classpermissionset_init(struct cil_classpermissionset **cps);
1079 void cil_classperms_set_init(struct cil_classperms_set **cp_set);
1080 void cil_classperms_init(struct cil_classperms **cp);
1081 void cil_classmapping_init(struct cil_classmapping **mapping);
1082 void cil_user_init(struct cil_user **user);
1083 void cil_userlevel_init(struct cil_userlevel **usrlvl);
1084 void cil_userrange_init(struct cil_userrange **userrange);
1085 void cil_role_init(struct cil_role **role);
1086 void cil_type_init(struct cil_type **type);
1087 void cil_cat_init(struct cil_cat **cat);
1088 void cil_args_init(struct cil_args **args);
1089 void cil_call_init(struct cil_call **call);
1090 void cil_optional_init(struct cil_optional **optional);
1091 void cil_param_init(struct cil_param **param);
1092 void cil_macro_init(struct cil_macro **macro);
1093 void cil_policycap_init(struct cil_policycap **policycap);
1094 void cil_bounds_init(struct cil_bounds **bounds);
1095 void cil_default_init(struct cil_default **def);
1096 void cil_defaultrange_init(struct cil_defaultrange **def);
1097 void cil_handleunknown_init(struct cil_handleunknown **unk);
1098 void cil_mls_init(struct cil_mls **mls);
1099 void cil_src_info_init(struct cil_src_info **info);
1100 void cil_userattribute_init(struct cil_userattribute **attribute);
1101 void cil_userattributeset_init(struct cil_userattributeset **attrset);
1102 
1103 #endif
1104