Coverage Report

Created: 2023-11-27 06:46

/src/selinux/libsepol/cil/src/cil.c
Line
Count
Source (jump to first uncovered line)
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
#include <stdlib.h>
31
#include <stdio.h>
32
33
#include <sepol/policydb/policydb.h>
34
#include <sepol/policydb/symtab.h>
35
36
#include "cil_internal.h"
37
#include "cil_flavor.h"
38
#include "cil_log.h"
39
#include "cil_mem.h"
40
#include "cil_tree.h"
41
#include "cil_list.h"
42
#include "cil_symtab.h"
43
#include "cil_build_ast.h"
44
45
#include "cil_parser.h"
46
#include "cil_build_ast.h"
47
#include "cil_resolve_ast.h"
48
#include "cil_fqn.h"
49
#include "cil_post.h"
50
#include "cil_binary.h"
51
#include "cil_policy.h"
52
#include "cil_strpool.h"
53
#include "cil_write_ast.h"
54
55
const int cil_sym_sizes[CIL_SYM_ARRAY_NUM][CIL_SYM_NUM] = {
56
  {64, 64, 64, 1 << 13, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64},
57
  {8, 8, 8, 32, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
58
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
59
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
60
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
61
};
62
63
char *CIL_KEY_CONS_T1;
64
char *CIL_KEY_CONS_T2;
65
char *CIL_KEY_CONS_T3;
66
char *CIL_KEY_CONS_R1;
67
char *CIL_KEY_CONS_R2;
68
char *CIL_KEY_CONS_R3;
69
char *CIL_KEY_CONS_U1;
70
char *CIL_KEY_CONS_U2;
71
char *CIL_KEY_CONS_U3;
72
char *CIL_KEY_CONS_L1;
73
char *CIL_KEY_CONS_L2;
74
char *CIL_KEY_CONS_H1;
75
char *CIL_KEY_CONS_H2;
76
char *CIL_KEY_AND;
77
char *CIL_KEY_OR;
78
char *CIL_KEY_NOT;
79
char *CIL_KEY_EQ;
80
char *CIL_KEY_NEQ;
81
char *CIL_KEY_CONS_DOM;
82
char *CIL_KEY_CONS_DOMBY;
83
char *CIL_KEY_CONS_INCOMP;
84
char *CIL_KEY_CONDTRUE;
85
char *CIL_KEY_CONDFALSE;
86
char *CIL_KEY_SELF;
87
char *CIL_KEY_NOTSELF;
88
char *CIL_KEY_OTHER;
89
char *CIL_KEY_OBJECT_R;
90
char *CIL_KEY_STAR;
91
char *CIL_KEY_TCP;
92
char *CIL_KEY_UDP;
93
char *CIL_KEY_DCCP;
94
char *CIL_KEY_SCTP;
95
char *CIL_KEY_AUDITALLOW;
96
char *CIL_KEY_TUNABLEIF;
97
char *CIL_KEY_ALLOW;
98
char *CIL_KEY_DONTAUDIT;
99
char *CIL_KEY_TYPETRANSITION;
100
char *CIL_KEY_TYPECHANGE;
101
char *CIL_KEY_CALL;
102
char *CIL_KEY_TUNABLE;
103
char *CIL_KEY_XOR;
104
char *CIL_KEY_ALL;
105
char *CIL_KEY_RANGE;
106
char *CIL_KEY_GLOB;
107
char *CIL_KEY_FILE;
108
char *CIL_KEY_DIR;
109
char *CIL_KEY_CHAR;
110
char *CIL_KEY_BLOCK;
111
char *CIL_KEY_SOCKET;
112
char *CIL_KEY_PIPE;
113
char *CIL_KEY_SYMLINK;
114
char *CIL_KEY_ANY;
115
char *CIL_KEY_XATTR;
116
char *CIL_KEY_TASK;
117
char *CIL_KEY_TRANS;
118
char *CIL_KEY_TYPE;
119
char *CIL_KEY_ROLE;
120
char *CIL_KEY_USER;
121
char *CIL_KEY_USERATTRIBUTE;
122
char *CIL_KEY_USERATTRIBUTESET;
123
char *CIL_KEY_SENSITIVITY;
124
char *CIL_KEY_CATEGORY;
125
char *CIL_KEY_CATSET;
126
char *CIL_KEY_LEVEL;
127
char *CIL_KEY_LEVELRANGE;
128
char *CIL_KEY_CLASS;
129
char *CIL_KEY_IPADDR;
130
char *CIL_KEY_MAP_CLASS;
131
char *CIL_KEY_CLASSPERMISSION;
132
char *CIL_KEY_BOOL;
133
char *CIL_KEY_STRING;
134
char *CIL_KEY_NAME;
135
char *CIL_KEY_SOURCE;
136
char *CIL_KEY_TARGET;
137
char *CIL_KEY_LOW;
138
char *CIL_KEY_HIGH;
139
char *CIL_KEY_LOW_HIGH;
140
char *CIL_KEY_GLBLUB;
141
char *CIL_KEY_HANDLEUNKNOWN;
142
char *CIL_KEY_HANDLEUNKNOWN_ALLOW;
143
char *CIL_KEY_HANDLEUNKNOWN_DENY;
144
char *CIL_KEY_HANDLEUNKNOWN_REJECT;
145
char *CIL_KEY_MACRO;
146
char *CIL_KEY_IN;
147
char *CIL_KEY_IN_BEFORE;
148
char *CIL_KEY_IN_AFTER;
149
char *CIL_KEY_MLS;
150
char *CIL_KEY_DEFAULTRANGE;
151
char *CIL_KEY_BLOCKINHERIT;
152
char *CIL_KEY_BLOCKABSTRACT;
153
char *CIL_KEY_CLASSORDER;
154
char *CIL_KEY_CLASSMAPPING;
155
char *CIL_KEY_CLASSPERMISSIONSET;
156
char *CIL_KEY_COMMON;
157
char *CIL_KEY_CLASSCOMMON;
158
char *CIL_KEY_SID;
159
char *CIL_KEY_SIDCONTEXT;
160
char *CIL_KEY_SIDORDER;
161
char *CIL_KEY_USERLEVEL;
162
char *CIL_KEY_USERRANGE;
163
char *CIL_KEY_USERBOUNDS;
164
char *CIL_KEY_USERPREFIX;
165
char *CIL_KEY_SELINUXUSER;
166
char *CIL_KEY_SELINUXUSERDEFAULT;
167
char *CIL_KEY_TYPEATTRIBUTE;
168
char *CIL_KEY_TYPEATTRIBUTESET;
169
char *CIL_KEY_EXPANDTYPEATTRIBUTE;
170
char *CIL_KEY_TYPEALIAS;
171
char *CIL_KEY_TYPEALIASACTUAL;
172
char *CIL_KEY_TYPEBOUNDS;
173
char *CIL_KEY_TYPEPERMISSIVE;
174
char *CIL_KEY_RANGETRANSITION;
175
char *CIL_KEY_USERROLE;
176
char *CIL_KEY_ROLETYPE;
177
char *CIL_KEY_ROLETRANSITION;
178
char *CIL_KEY_ROLEALLOW;
179
char *CIL_KEY_ROLEATTRIBUTE;
180
char *CIL_KEY_ROLEATTRIBUTESET;
181
char *CIL_KEY_ROLEBOUNDS;
182
char *CIL_KEY_BOOLEANIF;
183
char *CIL_KEY_NEVERALLOW;
184
char *CIL_KEY_TYPEMEMBER;
185
char *CIL_KEY_SENSALIAS;
186
char *CIL_KEY_SENSALIASACTUAL;
187
char *CIL_KEY_CATALIAS;
188
char *CIL_KEY_CATALIASACTUAL;
189
char *CIL_KEY_CATORDER;
190
char *CIL_KEY_SENSITIVITYORDER;
191
char *CIL_KEY_SENSCAT;
192
char *CIL_KEY_CONSTRAIN;
193
char *CIL_KEY_MLSCONSTRAIN;
194
char *CIL_KEY_VALIDATETRANS;
195
char *CIL_KEY_MLSVALIDATETRANS;
196
char *CIL_KEY_CONTEXT;
197
char *CIL_KEY_FILECON;
198
char *CIL_KEY_IBPKEYCON;
199
char *CIL_KEY_IBENDPORTCON;
200
char *CIL_KEY_PORTCON;
201
char *CIL_KEY_NODECON;
202
char *CIL_KEY_GENFSCON;
203
char *CIL_KEY_NETIFCON;
204
char *CIL_KEY_PIRQCON;
205
char *CIL_KEY_IOMEMCON;
206
char *CIL_KEY_IOPORTCON;
207
char *CIL_KEY_PCIDEVICECON;
208
char *CIL_KEY_DEVICETREECON;
209
char *CIL_KEY_FSUSE;
210
char *CIL_KEY_POLICYCAP;
211
char *CIL_KEY_OPTIONAL;
212
char *CIL_KEY_DEFAULTUSER;
213
char *CIL_KEY_DEFAULTROLE;
214
char *CIL_KEY_DEFAULTTYPE;
215
char *CIL_KEY_ROOT;
216
char *CIL_KEY_NODE;
217
char *CIL_KEY_PERM;
218
char *CIL_KEY_ALLOWX;
219
char *CIL_KEY_AUDITALLOWX;
220
char *CIL_KEY_DONTAUDITX;
221
char *CIL_KEY_NEVERALLOWX;
222
char *CIL_KEY_PERMISSIONX;
223
char *CIL_KEY_IOCTL;
224
char *CIL_KEY_UNORDERED;
225
char *CIL_KEY_SRC_INFO;
226
char *CIL_KEY_SRC_CIL;
227
char *CIL_KEY_SRC_HLL_LMS;
228
char *CIL_KEY_SRC_HLL_LMX;
229
char *CIL_KEY_SRC_HLL_LME;
230
char *CIL_KEY_DENY_RULE;
231
232
static void cil_init_keys(void)
233
11.8k
{
234
  /* Initialize CIL Keys into strpool */
235
11.8k
  CIL_KEY_CONS_T1 = cil_strpool_add("t1");
236
11.8k
  CIL_KEY_CONS_T2 = cil_strpool_add("t2");
237
11.8k
  CIL_KEY_CONS_T3 = cil_strpool_add("t3");
238
11.8k
  CIL_KEY_CONS_R1 = cil_strpool_add("r1");
239
11.8k
  CIL_KEY_CONS_R2 = cil_strpool_add("r2");
240
11.8k
  CIL_KEY_CONS_R3 = cil_strpool_add("r3");
241
11.8k
  CIL_KEY_CONS_U1 = cil_strpool_add("u1");
242
11.8k
  CIL_KEY_CONS_U2 = cil_strpool_add("u2");
243
11.8k
  CIL_KEY_CONS_U3 = cil_strpool_add("u3");
244
11.8k
  CIL_KEY_CONS_L1 = cil_strpool_add("l1");
245
11.8k
  CIL_KEY_CONS_L2 = cil_strpool_add("l2");
246
11.8k
  CIL_KEY_CONS_H1 = cil_strpool_add("h1");
247
11.8k
  CIL_KEY_CONS_H2 = cil_strpool_add("h2");
248
11.8k
  CIL_KEY_AND = cil_strpool_add("and");
249
11.8k
  CIL_KEY_OR = cil_strpool_add("or");
250
11.8k
  CIL_KEY_NOT = cil_strpool_add("not");
251
11.8k
  CIL_KEY_EQ = cil_strpool_add("eq");
252
11.8k
  CIL_KEY_NEQ = cil_strpool_add("neq");
253
11.8k
  CIL_KEY_CONS_DOM = cil_strpool_add("dom");
254
11.8k
  CIL_KEY_CONS_DOMBY = cil_strpool_add("domby");
255
11.8k
  CIL_KEY_CONS_INCOMP = cil_strpool_add("incomp");
256
11.8k
  CIL_KEY_CONDTRUE = cil_strpool_add("true");
257
11.8k
  CIL_KEY_CONDFALSE = cil_strpool_add("false");
258
11.8k
  CIL_KEY_SELF = cil_strpool_add("self");
259
11.8k
  CIL_KEY_NOTSELF = cil_strpool_add("notself");
260
11.8k
  CIL_KEY_OTHER = cil_strpool_add("other");
261
11.8k
  CIL_KEY_OBJECT_R = cil_strpool_add("object_r");
262
11.8k
  CIL_KEY_STAR = cil_strpool_add("*");
263
11.8k
  CIL_KEY_UDP = cil_strpool_add("udp");
264
11.8k
  CIL_KEY_TCP = cil_strpool_add("tcp");
265
11.8k
  CIL_KEY_DCCP = cil_strpool_add("dccp");
266
11.8k
  CIL_KEY_SCTP = cil_strpool_add("sctp");
267
11.8k
  CIL_KEY_AUDITALLOW = cil_strpool_add("auditallow");
268
11.8k
  CIL_KEY_TUNABLEIF = cil_strpool_add("tunableif");
269
11.8k
  CIL_KEY_ALLOW = cil_strpool_add("allow");
270
11.8k
  CIL_KEY_DONTAUDIT = cil_strpool_add("dontaudit");
271
11.8k
  CIL_KEY_TYPETRANSITION = cil_strpool_add("typetransition");
272
11.8k
  CIL_KEY_TYPECHANGE = cil_strpool_add("typechange");
273
11.8k
  CIL_KEY_CALL = cil_strpool_add("call");
274
11.8k
  CIL_KEY_TUNABLE = cil_strpool_add("tunable");
275
11.8k
  CIL_KEY_XOR = cil_strpool_add("xor");
276
11.8k
  CIL_KEY_ALL = cil_strpool_add("all");
277
11.8k
  CIL_KEY_RANGE = cil_strpool_add("range");
278
11.8k
  CIL_KEY_TYPE = cil_strpool_add("type");
279
11.8k
  CIL_KEY_ROLE = cil_strpool_add("role");
280
11.8k
  CIL_KEY_USER = cil_strpool_add("user");
281
11.8k
  CIL_KEY_USERATTRIBUTE = cil_strpool_add("userattribute");
282
11.8k
  CIL_KEY_USERATTRIBUTESET = cil_strpool_add("userattributeset");
283
11.8k
  CIL_KEY_SENSITIVITY = cil_strpool_add("sensitivity");
284
11.8k
  CIL_KEY_CATEGORY = cil_strpool_add("category");
285
11.8k
  CIL_KEY_CATSET = cil_strpool_add("categoryset");
286
11.8k
  CIL_KEY_LEVEL = cil_strpool_add("level");
287
11.8k
  CIL_KEY_LEVELRANGE = cil_strpool_add("levelrange");
288
11.8k
  CIL_KEY_CLASS = cil_strpool_add("class");
289
11.8k
  CIL_KEY_IPADDR = cil_strpool_add("ipaddr");
290
11.8k
  CIL_KEY_MAP_CLASS = cil_strpool_add("classmap");
291
11.8k
  CIL_KEY_CLASSPERMISSION = cil_strpool_add("classpermission");
292
11.8k
  CIL_KEY_BOOL = cil_strpool_add("boolean");
293
11.8k
  CIL_KEY_STRING = cil_strpool_add("string");
294
11.8k
  CIL_KEY_NAME = cil_strpool_add("name");
295
11.8k
  CIL_KEY_HANDLEUNKNOWN = cil_strpool_add("handleunknown");
296
11.8k
  CIL_KEY_HANDLEUNKNOWN_ALLOW = cil_strpool_add("allow");
297
11.8k
  CIL_KEY_HANDLEUNKNOWN_DENY = cil_strpool_add("deny");
298
11.8k
  CIL_KEY_HANDLEUNKNOWN_REJECT = cil_strpool_add("reject");
299
11.8k
  CIL_KEY_BLOCKINHERIT = cil_strpool_add("blockinherit");
300
11.8k
  CIL_KEY_BLOCKABSTRACT = cil_strpool_add("blockabstract");
301
11.8k
  CIL_KEY_CLASSORDER = cil_strpool_add("classorder");
302
11.8k
  CIL_KEY_CLASSMAPPING = cil_strpool_add("classmapping");
303
11.8k
  CIL_KEY_CLASSPERMISSIONSET = cil_strpool_add("classpermissionset");
304
11.8k
  CIL_KEY_COMMON = cil_strpool_add("common");
305
11.8k
  CIL_KEY_CLASSCOMMON = cil_strpool_add("classcommon");
306
11.8k
  CIL_KEY_SID = cil_strpool_add("sid");
307
11.8k
  CIL_KEY_SIDCONTEXT = cil_strpool_add("sidcontext");
308
11.8k
  CIL_KEY_SIDORDER = cil_strpool_add("sidorder");
309
11.8k
  CIL_KEY_USERLEVEL = cil_strpool_add("userlevel");
310
11.8k
  CIL_KEY_USERRANGE = cil_strpool_add("userrange");
311
11.8k
  CIL_KEY_USERBOUNDS = cil_strpool_add("userbounds");
312
11.8k
  CIL_KEY_USERPREFIX = cil_strpool_add("userprefix");
313
11.8k
  CIL_KEY_SELINUXUSER = cil_strpool_add("selinuxuser");
314
11.8k
  CIL_KEY_SELINUXUSERDEFAULT = cil_strpool_add("selinuxuserdefault");
315
11.8k
  CIL_KEY_TYPEATTRIBUTE = cil_strpool_add("typeattribute");
316
11.8k
  CIL_KEY_TYPEATTRIBUTESET = cil_strpool_add("typeattributeset");
317
11.8k
  CIL_KEY_EXPANDTYPEATTRIBUTE = cil_strpool_add("expandtypeattribute");
318
11.8k
  CIL_KEY_TYPEALIAS = cil_strpool_add("typealias");
319
11.8k
  CIL_KEY_TYPEALIASACTUAL = cil_strpool_add("typealiasactual");
320
11.8k
  CIL_KEY_TYPEBOUNDS = cil_strpool_add("typebounds");
321
11.8k
  CIL_KEY_TYPEPERMISSIVE = cil_strpool_add("typepermissive");
322
11.8k
  CIL_KEY_RANGETRANSITION = cil_strpool_add("rangetransition");
323
11.8k
  CIL_KEY_USERROLE = cil_strpool_add("userrole");
324
11.8k
  CIL_KEY_ROLETYPE = cil_strpool_add("roletype");
325
11.8k
  CIL_KEY_ROLETRANSITION = cil_strpool_add("roletransition");
326
11.8k
  CIL_KEY_ROLEALLOW = cil_strpool_add("roleallow");
327
11.8k
  CIL_KEY_ROLEATTRIBUTE = cil_strpool_add("roleattribute");
328
11.8k
  CIL_KEY_ROLEATTRIBUTESET = cil_strpool_add("roleattributeset");
329
11.8k
  CIL_KEY_ROLEBOUNDS = cil_strpool_add("rolebounds");
330
11.8k
  CIL_KEY_BOOLEANIF = cil_strpool_add("booleanif");
331
11.8k
  CIL_KEY_NEVERALLOW = cil_strpool_add("neverallow");
332
11.8k
  CIL_KEY_TYPEMEMBER = cil_strpool_add("typemember");
333
11.8k
  CIL_KEY_SENSALIAS = cil_strpool_add("sensitivityalias");
334
11.8k
  CIL_KEY_SENSALIASACTUAL = cil_strpool_add("sensitivityaliasactual");
335
11.8k
  CIL_KEY_CATALIAS = cil_strpool_add("categoryalias");
336
11.8k
  CIL_KEY_CATALIASACTUAL = cil_strpool_add("categoryaliasactual");
337
11.8k
  CIL_KEY_CATORDER = cil_strpool_add("categoryorder");
338
11.8k
  CIL_KEY_SENSITIVITYORDER = cil_strpool_add("sensitivityorder");
339
11.8k
  CIL_KEY_SENSCAT = cil_strpool_add("sensitivitycategory");
340
11.8k
  CIL_KEY_CONSTRAIN = cil_strpool_add("constrain");
341
11.8k
  CIL_KEY_MLSCONSTRAIN = cil_strpool_add("mlsconstrain");
342
11.8k
  CIL_KEY_VALIDATETRANS = cil_strpool_add("validatetrans");
343
11.8k
  CIL_KEY_MLSVALIDATETRANS = cil_strpool_add("mlsvalidatetrans");
344
11.8k
  CIL_KEY_CONTEXT = cil_strpool_add("context");
345
11.8k
  CIL_KEY_FILECON = cil_strpool_add("filecon");
346
11.8k
  CIL_KEY_IBPKEYCON = cil_strpool_add("ibpkeycon");
347
11.8k
  CIL_KEY_IBENDPORTCON = cil_strpool_add("ibendportcon");
348
11.8k
  CIL_KEY_PORTCON = cil_strpool_add("portcon");
349
11.8k
  CIL_KEY_NODECON = cil_strpool_add("nodecon");
350
11.8k
  CIL_KEY_GENFSCON = cil_strpool_add("genfscon");
351
11.8k
  CIL_KEY_NETIFCON = cil_strpool_add("netifcon");
352
11.8k
  CIL_KEY_PIRQCON = cil_strpool_add("pirqcon");
353
11.8k
  CIL_KEY_IOMEMCON = cil_strpool_add("iomemcon");
354
11.8k
  CIL_KEY_IOPORTCON = cil_strpool_add("ioportcon");
355
11.8k
  CIL_KEY_PCIDEVICECON = cil_strpool_add("pcidevicecon");
356
11.8k
  CIL_KEY_DEVICETREECON = cil_strpool_add("devicetreecon");
357
11.8k
  CIL_KEY_FSUSE = cil_strpool_add("fsuse");
358
11.8k
  CIL_KEY_POLICYCAP = cil_strpool_add("policycap");
359
11.8k
  CIL_KEY_OPTIONAL = cil_strpool_add("optional");
360
11.8k
  CIL_KEY_DEFAULTUSER = cil_strpool_add("defaultuser");
361
11.8k
  CIL_KEY_DEFAULTROLE = cil_strpool_add("defaultrole");
362
11.8k
  CIL_KEY_DEFAULTTYPE = cil_strpool_add("defaulttype");
363
11.8k
  CIL_KEY_MACRO = cil_strpool_add("macro");
364
11.8k
  CIL_KEY_IN = cil_strpool_add("in");
365
11.8k
  CIL_KEY_IN_BEFORE = cil_strpool_add("before");
366
11.8k
  CIL_KEY_IN_AFTER = cil_strpool_add("after");
367
11.8k
  CIL_KEY_MLS = cil_strpool_add("mls");
368
11.8k
  CIL_KEY_DEFAULTRANGE = cil_strpool_add("defaultrange");
369
11.8k
  CIL_KEY_GLOB = cil_strpool_add("*");
370
11.8k
  CIL_KEY_FILE = cil_strpool_add("file");
371
11.8k
  CIL_KEY_DIR = cil_strpool_add("dir");
372
11.8k
  CIL_KEY_CHAR = cil_strpool_add("char");
373
11.8k
  CIL_KEY_BLOCK = cil_strpool_add("block");
374
11.8k
  CIL_KEY_SOCKET = cil_strpool_add("socket");
375
11.8k
  CIL_KEY_PIPE = cil_strpool_add("pipe");
376
11.8k
  CIL_KEY_SYMLINK = cil_strpool_add("symlink");
377
11.8k
  CIL_KEY_ANY = cil_strpool_add("any");
378
11.8k
  CIL_KEY_XATTR = cil_strpool_add("xattr");
379
11.8k
  CIL_KEY_TASK = cil_strpool_add("task");
380
11.8k
  CIL_KEY_TRANS = cil_strpool_add("trans");
381
11.8k
  CIL_KEY_SOURCE = cil_strpool_add("source");
382
11.8k
  CIL_KEY_TARGET = cil_strpool_add("target");
383
11.8k
  CIL_KEY_LOW = cil_strpool_add("low");
384
11.8k
  CIL_KEY_HIGH = cil_strpool_add("high");
385
11.8k
  CIL_KEY_LOW_HIGH = cil_strpool_add("low-high");
386
11.8k
  CIL_KEY_GLBLUB = cil_strpool_add("glblub");
387
11.8k
  CIL_KEY_ROOT = cil_strpool_add("<root>");
388
11.8k
  CIL_KEY_NODE = cil_strpool_add("<node>");
389
11.8k
  CIL_KEY_PERM = cil_strpool_add("perm");
390
11.8k
  CIL_KEY_ALLOWX = cil_strpool_add("allowx");
391
11.8k
  CIL_KEY_AUDITALLOWX = cil_strpool_add("auditallowx");
392
11.8k
  CIL_KEY_DONTAUDITX = cil_strpool_add("dontauditx");
393
11.8k
  CIL_KEY_NEVERALLOWX = cil_strpool_add("neverallowx");
394
11.8k
  CIL_KEY_PERMISSIONX = cil_strpool_add("permissionx");
395
11.8k
  CIL_KEY_IOCTL = cil_strpool_add("ioctl");
396
11.8k
  CIL_KEY_UNORDERED = cil_strpool_add("unordered");
397
11.8k
  CIL_KEY_SRC_INFO = cil_strpool_add("<src_info>");
398
11.8k
  CIL_KEY_SRC_CIL = cil_strpool_add("cil");
399
11.8k
  CIL_KEY_SRC_HLL_LMS = cil_strpool_add("lms");
400
11.8k
  CIL_KEY_SRC_HLL_LMX = cil_strpool_add("lmx");
401
11.8k
  CIL_KEY_SRC_HLL_LME = cil_strpool_add("lme");
402
11.8k
  CIL_KEY_DENY_RULE = cil_strpool_add("deny");
403
11.8k
}
404
405
void cil_db_init(struct cil_db **db)
406
11.8k
{
407
11.8k
  *db = cil_malloc(sizeof(**db));
408
409
11.8k
  cil_strpool_init();
410
11.8k
  cil_init_keys();
411
412
11.8k
  cil_tree_init(&(*db)->parse);
413
11.8k
  cil_tree_init(&(*db)->ast);
414
11.8k
  cil_root_init((struct cil_root **)&(*db)->ast->root->data);
415
11.8k
  (*db)->sidorder = NULL;
416
11.8k
  (*db)->classorder = NULL;
417
11.8k
  (*db)->catorder = NULL;
418
11.8k
  (*db)->sensitivityorder = NULL;
419
11.8k
  cil_sort_init(&(*db)->netifcon);
420
11.8k
  cil_sort_init(&(*db)->genfscon);
421
11.8k
  cil_sort_init(&(*db)->filecon);
422
11.8k
  cil_sort_init(&(*db)->nodecon);
423
11.8k
  cil_sort_init(&(*db)->ibpkeycon);
424
11.8k
  cil_sort_init(&(*db)->ibendportcon);
425
11.8k
  cil_sort_init(&(*db)->portcon);
426
11.8k
  cil_sort_init(&(*db)->pirqcon);
427
11.8k
  cil_sort_init(&(*db)->iomemcon);
428
11.8k
  cil_sort_init(&(*db)->ioportcon);
429
11.8k
  cil_sort_init(&(*db)->pcidevicecon);
430
11.8k
  cil_sort_init(&(*db)->devicetreecon);
431
11.8k
  cil_sort_init(&(*db)->fsuse);
432
11.8k
  cil_list_init(&(*db)->userprefixes, CIL_LIST_ITEM);
433
11.8k
  cil_list_init(&(*db)->selinuxusers, CIL_LIST_ITEM);
434
11.8k
  cil_list_init(&(*db)->declared_strings, CIL_LIST_ITEM);
435
436
11.8k
  cil_type_init(&(*db)->selftype);
437
11.8k
  (*db)->selftype->datum.name = CIL_KEY_SELF;
438
11.8k
  (*db)->selftype->datum.fqn = CIL_KEY_SELF;
439
11.8k
  cil_type_init(&(*db)->notselftype);
440
11.8k
  (*db)->notselftype->datum.name = CIL_KEY_NOTSELF;
441
11.8k
  (*db)->notselftype->datum.fqn = CIL_KEY_NOTSELF;
442
11.8k
  cil_type_init(&(*db)->othertype);
443
11.8k
  (*db)->othertype->datum.name = CIL_KEY_OTHER;
444
11.8k
  (*db)->othertype->datum.fqn = CIL_KEY_OTHER;
445
11.8k
  (*db)->num_types_and_attrs = 0;
446
11.8k
  (*db)->num_classes = 0;
447
11.8k
  (*db)->num_types = 0;
448
11.8k
  (*db)->num_roles = 0;
449
11.8k
  (*db)->num_users = 0;
450
11.8k
  (*db)->num_cats = 0;
451
11.8k
  (*db)->val_to_type = NULL;
452
11.8k
  (*db)->val_to_role = NULL;
453
11.8k
  (*db)->val_to_user = NULL;
454
455
11.8k
  (*db)->disable_dontaudit = CIL_FALSE;
456
11.8k
  (*db)->disable_neverallow = CIL_FALSE;
457
11.8k
  (*db)->attrs_expand_generated = CIL_FALSE;
458
11.8k
  (*db)->attrs_expand_size = 1;
459
11.8k
  (*db)->preserve_tunables = CIL_FALSE;
460
11.8k
  (*db)->handle_unknown = -1;
461
11.8k
  (*db)->mls = -1;
462
11.8k
  (*db)->multiple_decls = CIL_FALSE;
463
11.8k
  (*db)->qualified_names = CIL_FALSE;
464
11.8k
  (*db)->target_platform = SEPOL_TARGET_SELINUX;
465
11.8k
  (*db)->policy_version = POLICYDB_VERSION_MAX;
466
11.8k
}
467
468
static void cil_declared_strings_list_destroy(struct cil_list **strings)
469
11.8k
{
470
11.8k
  struct cil_list_item *i;
471
472
11.8k
  cil_list_for_each(i, *strings) {
473
4.24k
    struct cil_symtab_datum *d = i->data;
474
4.24k
    cil_symtab_datum_destroy(d);
475
4.24k
    free(d);
476
4.24k
  }
477
11.8k
  cil_list_destroy(strings, CIL_FALSE);
478
11.8k
}
479
480
void cil_db_destroy(struct cil_db **db)
481
11.8k
{
482
11.8k
  if (db == NULL || *db == NULL) {
483
0
    return;
484
0
  }
485
486
11.8k
  cil_tree_destroy(&(*db)->parse);
487
11.8k
  cil_tree_destroy(&(*db)->ast);
488
11.8k
  cil_list_destroy(&(*db)->sidorder, CIL_FALSE);
489
11.8k
  cil_list_destroy(&(*db)->classorder, CIL_FALSE);
490
11.8k
  cil_list_destroy(&(*db)->catorder, CIL_FALSE);
491
11.8k
  cil_list_destroy(&(*db)->sensitivityorder, CIL_FALSE);
492
11.8k
  cil_sort_destroy(&(*db)->netifcon);
493
11.8k
  cil_sort_destroy(&(*db)->genfscon);
494
11.8k
  cil_sort_destroy(&(*db)->filecon);
495
11.8k
  cil_sort_destroy(&(*db)->nodecon);
496
11.8k
  cil_sort_destroy(&(*db)->ibpkeycon);
497
11.8k
  cil_sort_destroy(&(*db)->ibendportcon);
498
11.8k
  cil_sort_destroy(&(*db)->portcon);
499
11.8k
  cil_sort_destroy(&(*db)->pirqcon);
500
11.8k
  cil_sort_destroy(&(*db)->iomemcon);
501
11.8k
  cil_sort_destroy(&(*db)->ioportcon);
502
11.8k
  cil_sort_destroy(&(*db)->pcidevicecon);
503
11.8k
  cil_sort_destroy(&(*db)->devicetreecon);
504
11.8k
  cil_sort_destroy(&(*db)->fsuse);
505
11.8k
  cil_list_destroy(&(*db)->userprefixes, CIL_FALSE);
506
11.8k
  cil_list_destroy(&(*db)->selinuxusers, CIL_FALSE);
507
508
11.8k
  cil_declared_strings_list_destroy(&(*db)->declared_strings);
509
510
11.8k
  cil_destroy_type((*db)->selftype);
511
11.8k
  cil_destroy_type((*db)->notselftype);
512
11.8k
  cil_destroy_type((*db)->othertype);
513
514
11.8k
  cil_strpool_destroy();
515
11.8k
  free((*db)->val_to_type);
516
11.8k
  free((*db)->val_to_role);
517
11.8k
  free((*db)->val_to_user);
518
519
11.8k
  free(*db);
520
11.8k
  *db = NULL; 
521
11.8k
}
522
523
void cil_root_init(struct cil_root **root)
524
11.8k
{
525
11.8k
  struct cil_root *r = cil_malloc(sizeof(*r));
526
11.8k
  cil_symtab_array_init(r->symtab, cil_sym_sizes[CIL_SYM_ARRAY_ROOT]);
527
528
11.8k
  *root = r;
529
11.8k
}
530
531
void cil_root_destroy(struct cil_root *root)
532
11.8k
{
533
11.8k
  if (root == NULL) {
534
0
    return;
535
0
  }
536
11.8k
  cil_symtab_array_destroy(root->symtab);
537
11.8k
  free(root);
538
11.8k
}
539
540
int cil_add_file(cil_db_t *db, const char *name, const char *data, size_t size)
541
11.8k
{
542
11.8k
  char *buffer = NULL;
543
11.8k
  int rc;
544
545
11.8k
  cil_log(CIL_INFO, "Parsing %s\n", name);
546
547
11.8k
  buffer = cil_malloc(size + 2);
548
11.8k
  memcpy(buffer, data, size);
549
11.8k
  memset(buffer + size, 0, 2);
550
551
11.8k
  rc = cil_parser(name, buffer, size + 2, &db->parse);
552
11.8k
  if (rc != SEPOL_OK) {
553
457
    cil_log(CIL_INFO, "Failed to parse %s\n", name);
554
457
    goto exit;
555
457
  }
556
557
11.4k
  free(buffer);
558
11.4k
  buffer = NULL;
559
560
11.4k
  rc = SEPOL_OK;
561
562
11.8k
exit:
563
11.8k
  free(buffer);
564
565
11.8k
  return rc;
566
11.4k
}
567
568
int cil_compile(struct cil_db *db)
569
11.4k
{
570
11.4k
  int rc = SEPOL_ERR;
571
572
11.4k
  if (db == NULL) {
573
0
    goto exit;
574
0
  }
575
576
11.4k
  cil_log(CIL_INFO, "Building AST from Parse Tree\n");
577
11.4k
  rc = cil_build_ast(db, db->parse->root, db->ast->root);
578
11.4k
  if (rc != SEPOL_OK) {
579
1.30k
    cil_log(CIL_ERR, "Failed to build AST\n");
580
1.30k
    goto exit;
581
1.30k
  }
582
583
10.1k
  cil_log(CIL_INFO, "Destroying Parse Tree\n");
584
10.1k
  cil_tree_destroy(&db->parse);
585
586
10.1k
  cil_log(CIL_INFO, "Resolving AST\n");
587
10.1k
  rc = cil_resolve_ast(db, db->ast->root);
588
10.1k
  if (rc != SEPOL_OK) {
589
4.71k
    cil_log(CIL_ERR, "Failed to resolve AST\n");
590
4.71k
    goto exit;
591
4.71k
  }
592
593
5.42k
  cil_log(CIL_INFO, "Qualifying Names\n");
594
5.42k
  rc = cil_fqn_qualify(db->ast->root);
595
5.42k
  if (rc != SEPOL_OK) {
596
5
    cil_log(CIL_ERR, "Failed to qualify names\n");
597
5
    goto exit;
598
5
  }
599
600
5.41k
  cil_log(CIL_INFO, "Compile post process\n");
601
5.41k
  rc = cil_post_process(db);
602
5.41k
  if (rc != SEPOL_OK ) {
603
3.09k
    cil_log(CIL_ERR, "Post process failed\n");
604
3.09k
    goto exit;
605
3.09k
  }
606
607
11.4k
exit:
608
609
11.4k
  return rc;
610
5.41k
}
611
612
int cil_write_parse_ast(FILE *out, cil_db_t *db)
613
0
{
614
0
  int rc = SEPOL_ERR;
615
616
0
  if (db == NULL) {
617
0
    goto exit;
618
0
  }
619
620
0
  cil_log(CIL_INFO, "Writing Parse AST\n");
621
0
  rc = cil_write_ast(out, CIL_WRITE_AST_PHASE_PARSE, db->parse->root);
622
0
  if (rc != SEPOL_OK) {
623
0
    cil_log(CIL_ERR, "Failed to write parse ast\n");
624
0
    goto exit;
625
0
  }
626
627
0
exit:
628
0
  return rc;
629
0
}
630
631
int cil_write_build_ast(FILE *out, cil_db_t *db)
632
0
{
633
0
  int rc = SEPOL_ERR;
634
635
0
  if (db == NULL) {
636
0
    goto exit;
637
0
  }
638
639
0
  cil_log(CIL_INFO, "Building AST from Parse Tree\n");
640
0
  rc = cil_build_ast(db, db->parse->root, db->ast->root);
641
0
  if (rc != SEPOL_OK) {
642
0
    cil_log(CIL_ERR, "Failed to build ast\n");
643
0
    goto exit;
644
0
  }
645
646
0
  cil_log(CIL_INFO, "Destroying Parse Tree\n");
647
0
  cil_tree_destroy(&db->parse);
648
649
0
  cil_log(CIL_INFO, "Writing Build AST\n");
650
0
  rc = cil_write_ast(out, CIL_WRITE_AST_PHASE_BUILD, db->ast->root);
651
0
  if (rc != SEPOL_OK) {
652
0
    cil_log(CIL_ERR, "Failed to write build ast\n");
653
0
    goto exit;
654
0
  }
655
656
0
exit:
657
0
  return rc;
658
0
}
659
660
int cil_write_resolve_ast(FILE *out, cil_db_t *db)
661
0
{
662
0
  int rc = SEPOL_ERR;
663
664
0
  if (db == NULL) {
665
0
    goto exit;
666
0
  }
667
668
0
  cil_log(CIL_INFO, "Building AST from Parse Tree\n");
669
0
  rc = cil_build_ast(db, db->parse->root, db->ast->root);
670
0
  if (rc != SEPOL_OK) {
671
0
    cil_log(CIL_ERR, "Failed to build ast\n");
672
0
    goto exit;
673
0
  }
674
675
0
  cil_log(CIL_INFO, "Destroying Parse Tree\n");
676
0
  cil_tree_destroy(&db->parse);
677
678
0
  cil_log(CIL_INFO, "Resolving AST\n");
679
0
  rc = cil_resolve_ast(db, db->ast->root);
680
0
  if (rc != SEPOL_OK) {
681
0
    cil_log(CIL_ERR, "Failed to resolve ast\n");
682
0
    goto exit;
683
0
  }
684
685
0
  cil_log(CIL_INFO, "Qualifying Names\n");
686
0
  rc = cil_fqn_qualify(db->ast->root);
687
0
  if (rc != SEPOL_OK) {
688
0
    cil_log(CIL_ERR, "Failed to qualify names\n");
689
0
    goto exit;
690
0
  }
691
692
0
  cil_log(CIL_INFO, "Writing Resolve AST\n");
693
0
  rc = cil_write_ast(out, CIL_WRITE_AST_PHASE_RESOLVE, db->ast->root);
694
0
  if (rc != SEPOL_OK) {
695
0
    cil_log(CIL_ERR, "Failed to write resolve ast\n");
696
0
    goto exit;
697
0
  }
698
699
0
exit:
700
0
  return rc;
701
0
}
702
703
int cil_write_post_ast(FILE *out, cil_db_t *db)
704
0
{
705
0
  int rc = SEPOL_ERR;
706
707
0
  if (db == NULL) {
708
0
    goto exit;
709
0
  }
710
711
0
  cil_log(CIL_INFO, "Building AST from Parse Tree\n");
712
0
  rc = cil_build_ast(db, db->parse->root, db->ast->root);
713
0
  if (rc != SEPOL_OK) {
714
0
    cil_log(CIL_ERR, "Failed to build ast\n");
715
0
    goto exit;
716
0
  }
717
718
0
  cil_log(CIL_INFO, "Destroying Parse Tree\n");
719
0
  cil_tree_destroy(&db->parse);
720
721
0
  cil_log(CIL_INFO, "Resolving AST\n");
722
0
  rc = cil_resolve_ast(db, db->ast->root);
723
0
  if (rc != SEPOL_OK) {
724
0
    cil_log(CIL_ERR, "Failed to resolve ast\n");
725
0
    goto exit;
726
0
  }
727
728
0
  cil_log(CIL_INFO, "Qualifying Names\n");
729
0
  rc = cil_fqn_qualify(db->ast->root);
730
0
  if (rc != SEPOL_OK) {
731
0
    cil_log(CIL_ERR, "Failed to qualify names\n");
732
0
    goto exit;
733
0
  }
734
735
0
  cil_log(CIL_INFO, "Compile post process\n");
736
0
  rc = cil_post_process(db);
737
0
  if (rc != SEPOL_OK ) {
738
0
    cil_log(CIL_ERR, "Post process failed\n");
739
0
    goto exit;
740
0
  }
741
742
0
  cil_log(CIL_INFO, "Writing Post AST\n");
743
0
  rc = cil_write_ast(out, CIL_WRITE_AST_PHASE_POST, db->ast->root);
744
0
  if (rc != SEPOL_OK) {
745
0
    cil_log(CIL_ERR, "Failed to write post ast\n");
746
0
    goto exit;
747
0
  }
748
749
0
exit:
750
0
  return rc;
751
0
}
752
753
int cil_build_policydb(cil_db_t *db, sepol_policydb_t **sepol_db)
754
2.31k
{
755
2.31k
  int rc;
756
757
2.31k
  cil_log(CIL_INFO, "Building policy binary\n");
758
2.31k
  rc = cil_binary_create(db, sepol_db);
759
2.31k
  if (rc != SEPOL_OK) {
760
784
    cil_log(CIL_ERR, "Failed to generate binary\n");
761
784
    goto exit;
762
784
  }
763
764
2.31k
exit:
765
2.31k
  return rc;
766
2.31k
}
767
768
void cil_write_policy_conf(FILE *out, struct cil_db *db)
769
0
{
770
0
  cil_log(CIL_INFO, "Writing policy.conf file\n");
771
0
  cil_gen_policy(out, db);
772
0
}
773
774
void cil_destroy_data(void **data, enum cil_flavor flavor)
775
14.2M
{
776
14.2M
  if (*data == NULL) {
777
1.37M
    return;
778
1.37M
  }
779
780
12.8M
  switch(flavor) {
781
0
  case CIL_NONE:
782
0
    break;
783
11.8k
  case CIL_ROOT:
784
11.8k
    cil_root_destroy(*data);
785
11.8k
    break;
786
2.44M
  case CIL_NODE:
787
2.44M
    break;
788
3.42M
  case CIL_STRING:
789
3.42M
    break;
790
0
  case CIL_DATUM:
791
0
    break;
792
0
  case CIL_LIST:
793
0
    cil_list_destroy(*data, CIL_FALSE);
794
0
    break;
795
0
  case CIL_LIST_ITEM:
796
0
    break;
797
18.0k
  case CIL_PARAM:
798
18.0k
    cil_destroy_param(*data);
799
18.0k
    break;
800
60.5k
  case CIL_ARGS:
801
60.5k
    cil_destroy_args(*data);
802
60.5k
    break;
803
355k
  case CIL_BLOCK:
804
355k
    cil_destroy_block(*data);
805
355k
    break;
806
152k
  case CIL_BLOCKINHERIT:
807
152k
    cil_destroy_blockinherit(*data);
808
152k
    break;
809
786
  case CIL_BLOCKABSTRACT:
810
786
    cil_destroy_blockabstract(*data);
811
786
    break;
812
17.2k
  case CIL_IN:
813
17.2k
    cil_destroy_in(*data);
814
17.2k
    break;
815
19.0k
  case CIL_MACRO:
816
19.0k
    cil_destroy_macro(*data);
817
19.0k
    break;
818
101k
  case CIL_CALL:
819
101k
    cil_destroy_call(*data);
820
101k
    break;
821
37.8k
  case CIL_OPTIONAL:
822
37.8k
    cil_destroy_optional(*data);
823
37.8k
    break;
824
12.4k
  case CIL_BOOL:
825
12.4k
    cil_destroy_bool(*data);
826
12.4k
    break;
827
189k
  case CIL_BOOLEANIF:
828
189k
    cil_destroy_boolif(*data);
829
189k
    break;
830
1.30k
  case CIL_TUNABLE:
831
1.30k
    cil_destroy_tunable(*data);
832
1.30k
    break;
833
5.23k
  case CIL_TUNABLEIF:
834
5.23k
    cil_destroy_tunif(*data);
835
5.23k
    break;
836
196k
  case CIL_CONDBLOCK:
837
196k
    cil_destroy_condblock(*data);
838
196k
    break;
839
0
  case CIL_CONDTRUE:
840
0
    break;
841
0
  case CIL_CONDFALSE:
842
0
    break;
843
120k
  case CIL_PERM:
844
134k
  case CIL_MAP_PERM:
845
134k
    cil_destroy_perm(*data);
846
134k
    break;
847
2.02k
  case CIL_COMMON:
848
25.9k
  case CIL_CLASS:
849
38.0k
  case CIL_MAP_CLASS:
850
38.0k
    cil_destroy_class(*data);
851
38.0k
    break;
852
14.1k
  case CIL_CLASSORDER:
853
14.1k
    cil_destroy_ordered(*data);
854
14.1k
    break;
855
6.38k
  case CIL_CLASSPERMISSION:
856
6.38k
    cil_destroy_classpermission(*data);
857
6.38k
    break;
858
4.75k
  case CIL_CLASSCOMMON:
859
4.75k
    cil_destroy_classcommon(*data);
860
4.75k
    break;
861
41.9k
  case CIL_CLASSMAPPING:
862
41.9k
    cil_destroy_classmapping(*data);
863
41.9k
    break;
864
6.78k
  case CIL_CLASSPERMS:
865
6.78k
    cil_destroy_classperms(*data);
866
6.78k
    break;
867
0
  case CIL_CLASSPERMS_SET:
868
0
    cil_destroy_classperms_set(*data);
869
0
    break;
870
14.1k
  case CIL_CLASSPERMISSIONSET:
871
14.1k
    cil_destroy_classpermissionset(*data);
872
14.1k
    break;
873
9.91k
  case CIL_USER:
874
9.91k
    cil_destroy_user(*data);
875
9.91k
    break;
876
4.54k
  case CIL_USERATTRIBUTE:
877
4.54k
    cil_destroy_userattribute(*data);
878
4.54k
    break;
879
8.68k
  case CIL_USERATTRIBUTESET:
880
8.68k
    cil_destroy_userattributeset(*data);
881
8.68k
    break;
882
2.68k
  case CIL_USERPREFIX:
883
2.68k
    cil_destroy_userprefix(*data);
884
2.68k
    break;
885
13.0k
  case CIL_USERROLE:
886
13.0k
    cil_destroy_userrole(*data);
887
13.0k
    break;
888
31.0k
  case CIL_USERLEVEL:
889
31.0k
    cil_destroy_userlevel(*data);
890
31.0k
    break;
891
45.5k
  case CIL_USERRANGE:
892
45.5k
    cil_destroy_userrange(*data);
893
45.5k
    break;
894
2.13k
  case CIL_USERBOUNDS:
895
2.13k
    cil_destroy_bounds(*data);
896
2.13k
    break;
897
2.48k
  case CIL_SELINUXUSER:
898
3.89k
  case CIL_SELINUXUSERDEFAULT:
899
3.89k
    cil_destroy_selinuxuser(*data);
900
3.89k
    break;
901
17.1k
  case CIL_ROLE:
902
17.1k
    cil_destroy_role(*data);
903
17.1k
    break;
904
7.62k
  case CIL_ROLEATTRIBUTE:
905
7.62k
    cil_destroy_roleattribute(*data);
906
7.62k
    break;
907
15.6k
  case CIL_ROLEATTRIBUTESET:
908
15.6k
    cil_destroy_roleattributeset(*data);
909
15.6k
    break;
910
28.2k
  case CIL_ROLETYPE:
911
28.2k
    cil_destroy_roletype(*data);
912
28.2k
    break;
913
16.5k
  case CIL_ROLEBOUNDS:
914
16.5k
    cil_destroy_bounds(*data);
915
16.5k
    break;
916
404k
  case CIL_TYPE:
917
404k
    cil_destroy_type(*data);
918
404k
    break;
919
120k
  case CIL_TYPEATTRIBUTE:
920
120k
    cil_destroy_typeattribute(*data);
921
120k
    break;
922
2.21k
  case CIL_TYPEALIAS:
923
2.21k
    cil_destroy_alias(*data);
924
2.21k
    break;
925
111k
  case CIL_TYPEATTRIBUTESET:
926
111k
    cil_destroy_typeattributeset(*data);
927
111k
    break;
928
1.66k
  case CIL_EXPANDTYPEATTRIBUTE:
929
1.66k
    cil_destroy_expandtypeattribute(*data);
930
1.66k
    break;
931
2.54k
  case CIL_TYPEALIASACTUAL:
932
2.54k
    cil_destroy_aliasactual(*data);
933
2.54k
    break;
934
4.74k
  case CIL_TYPEBOUNDS:
935
4.74k
    cil_destroy_bounds(*data);
936
4.74k
    break;
937
4.07k
  case CIL_TYPEPERMISSIVE:
938
4.07k
    cil_destroy_typepermissive(*data);
939
4.07k
    break;
940
5.28k
  case CIL_SENS:
941
5.28k
    cil_destroy_sensitivity(*data);
942
5.28k
    break;
943
886
  case CIL_SENSALIAS:
944
886
    cil_destroy_alias(*data);
945
886
    break;
946
1.21k
  case CIL_SENSALIASACTUAL:
947
1.21k
    cil_destroy_aliasactual(*data);
948
1.21k
    break;
949
5.71k
  case CIL_SENSITIVITYORDER:
950
5.71k
    cil_destroy_ordered(*data);
951
5.71k
    break;
952
9.44k
  case CIL_SENSCAT:
953
9.44k
    cil_destroy_senscat(*data);
954
9.44k
    break;
955
7.99k
  case CIL_CAT:
956
7.99k
    cil_destroy_category(*data);
957
7.99k
    break;
958
2.85k
  case CIL_CATSET:
959
2.85k
    cil_destroy_catset(*data);
960
2.85k
    break;
961
1.20k
  case CIL_CATALIAS:
962
1.20k
    cil_destroy_alias(*data);
963
1.20k
    break;
964
2.46k
  case CIL_CATALIASACTUAL:
965
2.46k
    cil_destroy_aliasactual(*data);
966
2.46k
    break;
967
93.3k
  case CIL_CATORDER:
968
93.3k
    cil_destroy_ordered(*data);
969
93.3k
    break;
970
3.15k
  case CIL_LEVEL:
971
3.15k
    cil_destroy_level(*data);
972
3.15k
    break;
973
4.59k
  case CIL_LEVELRANGE:
974
4.59k
    cil_destroy_levelrange(*data);
975
4.59k
    break;
976
12.3k
  case CIL_SID:
977
12.3k
    cil_destroy_sid(*data);
978
12.3k
    break;
979
22.6k
  case CIL_SIDORDER:
980
22.6k
    cil_destroy_ordered(*data);
981
22.6k
    break;
982
6.54k
  case CIL_ROLEALLOW:
983
6.54k
    cil_destroy_roleallow(*data);
984
6.54k
    break;
985
1.04M
  case CIL_AVRULE:
986
1.06M
  case CIL_AVRULEX:
987
1.06M
    cil_destroy_avrule(*data);
988
1.06M
    break;
989
2.35k
  case CIL_PERMISSIONX:
990
2.35k
    cil_destroy_permissionx(*data);
991
2.35k
    break;
992
38.5k
  case CIL_DENY_RULE:
993
38.5k
    cil_destroy_deny_rule(*data);
994
38.5k
    break;
995
15.8k
  case CIL_ROLETRANSITION:
996
15.8k
    cil_destroy_roletransition(*data);
997
15.8k
    break;
998
28.2k
  case CIL_TYPE_RULE:
999
28.2k
    cil_destroy_type_rule(*data);
1000
28.2k
    break;
1001
90.0k
  case CIL_NAMETYPETRANSITION:
1002
90.0k
    cil_destroy_typetransition(*data);
1003
90.0k
    break;
1004
25.5k
  case CIL_RANGETRANSITION:
1005
25.5k
    cil_destroy_rangetransition(*data);
1006
25.5k
    break;
1007
27.2k
  case CIL_CONSTRAIN:
1008
27.2k
    cil_destroy_constrain(*data);
1009
27.2k
    break;
1010
40.2k
  case CIL_MLSCONSTRAIN:
1011
40.2k
    cil_destroy_constrain(*data);
1012
40.2k
    break;
1013
37.1k
  case CIL_VALIDATETRANS:
1014
43.4k
  case CIL_MLSVALIDATETRANS:
1015
43.4k
    cil_destroy_validatetrans(*data);
1016
43.4k
    break;
1017
3.34k
  case CIL_CONTEXT:
1018
3.34k
    cil_destroy_context(*data);
1019
3.34k
    break;
1020
1.67k
  case CIL_IPADDR:
1021
1.67k
    cil_destroy_ipaddr(*data);
1022
1.67k
    break;
1023
0
  case CIL_DECLARED_STRING:
1024
0
    break;
1025
5.71k
  case CIL_SIDCONTEXT:
1026
5.71k
    cil_destroy_sidcontext(*data);
1027
5.71k
    break;
1028
116k
  case CIL_FSUSE:
1029
116k
    cil_destroy_fsuse(*data);
1030
116k
    break;
1031
50.2k
  case CIL_FILECON:
1032
50.2k
    cil_destroy_filecon(*data);
1033
50.2k
    break;
1034
970k
  case CIL_IBPKEYCON:
1035
970k
    cil_destroy_ibpkeycon(*data);
1036
970k
    break;
1037
1.01M
  case CIL_PORTCON:
1038
1.01M
    cil_destroy_portcon(*data);
1039
1.01M
    break;
1040
10.4k
  case CIL_IBENDPORTCON:
1041
10.4k
    cil_destroy_ibendportcon(*data);
1042
10.4k
    break;
1043
18.6k
  case CIL_NODECON:
1044
18.6k
    cil_destroy_nodecon(*data);
1045
18.6k
    break;
1046
12.4k
  case CIL_GENFSCON:
1047
12.4k
    cil_destroy_genfscon(*data);
1048
12.4k
    break;
1049
8.38k
  case CIL_NETIFCON:
1050
8.38k
    cil_destroy_netifcon(*data);
1051
8.38k
    break;
1052
153k
  case CIL_PIRQCON:
1053
153k
    cil_destroy_pirqcon(*data);
1054
153k
    break;
1055
13.3k
  case CIL_IOMEMCON:
1056
13.3k
    cil_destroy_iomemcon(*data);
1057
13.3k
    break;
1058
15.4k
  case CIL_IOPORTCON:
1059
15.4k
    cil_destroy_ioportcon(*data);
1060
15.4k
    break;
1061
12.3k
  case CIL_PCIDEVICECON:
1062
12.3k
    cil_destroy_pcidevicecon(*data);
1063
12.3k
    break;
1064
6.87k
  case CIL_DEVICETREECON:
1065
6.87k
    cil_destroy_devicetreecon(*data);
1066
6.87k
    break;
1067
12.3k
  case CIL_POLICYCAP:
1068
12.3k
    cil_destroy_policycap(*data);
1069
12.3k
    break;
1070
8.57k
  case CIL_DEFAULTUSER:
1071
24.9k
  case CIL_DEFAULTROLE:
1072
29.2k
  case CIL_DEFAULTTYPE:
1073
29.2k
    cil_destroy_default(*data);
1074
29.2k
    break;
1075
16.9k
  case CIL_DEFAULTRANGE:
1076
16.9k
    cil_destroy_defaultrange(*data);
1077
16.9k
    break;
1078
905
  case CIL_HANDLEUNKNOWN:
1079
905
    cil_destroy_handleunknown(*data);
1080
905
    break;
1081
3.29k
  case CIL_MLS:
1082
3.29k
    cil_destroy_mls(*data);
1083
3.29k
    break;
1084
14.6k
  case CIL_SRC_INFO:
1085
14.6k
    cil_destroy_src_info(*data);
1086
14.6k
    break;
1087
396k
  case CIL_OP:
1088
675k
  case CIL_CONS_OPERAND:
1089
675k
    break;
1090
0
  default:
1091
0
    cil_log(CIL_INFO, "Unknown data flavor: %d\n", flavor);
1092
0
    break;
1093
12.8M
  }
1094
1095
12.8M
  *data = NULL;
1096
12.8M
}
1097
1098
int cil_flavor_to_symtab_index(enum cil_flavor flavor, enum cil_sym_index *sym_index)
1099
1.45M
{
1100
1.45M
  if (flavor < CIL_MIN_DECLARATIVE) {
1101
0
    return SEPOL_ERR;
1102
0
  }
1103
1104
1.45M
  switch(flavor) {
1105
332k
  case CIL_BLOCK:
1106
332k
    *sym_index = CIL_SYM_BLOCKS;
1107
332k
    break;
1108
12.1k
  case CIL_MACRO:
1109
12.1k
    *sym_index = CIL_SYM_BLOCKS;
1110
12.1k
    break;
1111
392k
  case CIL_OPTIONAL:
1112
392k
    *sym_index = CIL_SYM_BLOCKS;
1113
392k
    break;
1114
11.6k
  case CIL_BOOL:
1115
11.6k
    *sym_index = CIL_SYM_BOOLS;
1116
11.6k
    break;
1117
501
  case CIL_TUNABLE:
1118
501
    *sym_index = CIL_SYM_TUNABLES;
1119
501
    break;
1120
23.6k
  case CIL_PERM:
1121
32.8k
  case CIL_MAP_PERM:
1122
32.8k
    *sym_index = CIL_SYM_PERMS;
1123
32.8k
    break;
1124
879
  case CIL_COMMON:
1125
879
    *sym_index = CIL_SYM_COMMONS;
1126
879
    break;
1127
2.56k
  case CIL_CLASS:
1128
11.6k
  case CIL_MAP_CLASS:
1129
11.6k
    *sym_index = CIL_SYM_CLASSES;
1130
11.6k
    break;
1131
62.5k
  case CIL_CLASSPERMISSION:
1132
62.5k
  case CIL_CLASSPERMISSIONSET:
1133
62.5k
    *sym_index = CIL_SYM_CLASSPERMSETS;
1134
62.5k
    break;
1135
23.6k
  case CIL_USER:
1136
27.5k
  case CIL_USERATTRIBUTE:
1137
27.5k
    *sym_index = CIL_SYM_USERS;
1138
27.5k
    break;
1139
14.2k
  case CIL_ROLE:
1140
19.1k
  case CIL_ROLEATTRIBUTE:
1141
19.1k
    *sym_index = CIL_SYM_ROLES;
1142
19.1k
    break;
1143
414k
  case CIL_TYPE:
1144
416k
  case CIL_TYPEALIAS:
1145
506k
  case CIL_TYPEATTRIBUTE:
1146
506k
    *sym_index = CIL_SYM_TYPES;
1147
506k
    break;
1148
3.31k
  case CIL_SENS:
1149
4.20k
  case CIL_SENSALIAS:
1150
4.20k
    *sym_index = CIL_SYM_SENS;
1151
4.20k
    break;
1152
2.13k
  case CIL_CAT:
1153
4.80k
  case CIL_CATSET:
1154
6.01k
  case CIL_CATALIAS:
1155
6.01k
    *sym_index = CIL_SYM_CATS;
1156
6.01k
    break;
1157
3.52k
  case CIL_LEVEL:
1158
3.52k
    *sym_index = CIL_SYM_LEVELS;
1159
3.52k
    break;
1160
7.22k
  case CIL_LEVELRANGE:
1161
7.22k
    *sym_index = CIL_SYM_LEVELRANGES;
1162
7.22k
    break;
1163
898
  case CIL_SID:
1164
898
    *sym_index = CIL_SYM_SIDS;
1165
898
    break;
1166
3.52k
  case CIL_DECLARED_STRING:
1167
3.52k
    *sym_index = CIL_SYM_STRINGS;
1168
3.52k
    break;
1169
2.58k
  case CIL_CONTEXT:
1170
2.58k
    *sym_index = CIL_SYM_CONTEXTS;
1171
2.58k
    break;
1172
6.55k
  case CIL_IPADDR:
1173
6.55k
    *sym_index = CIL_SYM_IPADDRS;
1174
6.55k
    break;
1175
11.5k
  case CIL_POLICYCAP:
1176
11.5k
    *sym_index = CIL_SYM_POLICYCAPS;
1177
11.5k
    break;
1178
818
  case CIL_PERMISSIONX:
1179
818
    *sym_index = CIL_SYM_PERMX;
1180
818
    break;
1181
0
  default:
1182
0
    *sym_index = CIL_SYM_UNKNOWN;
1183
0
    cil_log(CIL_INFO, "Failed to find flavor: %d\n", flavor);
1184
0
    return SEPOL_ERR;
1185
1.45M
  }
1186
1187
1.45M
  return SEPOL_OK;
1188
1.45M
}
1189
1190
const char * cil_node_to_string(struct cil_tree_node *node)
1191
685k
{
1192
685k
  switch (node->flavor) {
1193
0
  case CIL_NONE:
1194
0
    return "<none>";
1195
46.5k
  case CIL_ROOT:
1196
46.5k
    return CIL_KEY_ROOT;
1197
19
  case CIL_NODE:
1198
19
    return CIL_KEY_NODE;
1199
0
  case CIL_STRING:
1200
0
    return CIL_KEY_STRING;
1201
0
  case CIL_DATUM:
1202
0
    return "<datum>";
1203
0
  case CIL_LIST:
1204
0
    return "<list>";
1205
0
  case CIL_LIST_ITEM:
1206
0
    return "<list_item>";
1207
0
  case CIL_PARAM:
1208
0
    return "<param>";
1209
0
  case CIL_ARGS:
1210
0
    return "<args>";
1211
236k
  case CIL_BLOCK:
1212
236k
    return CIL_KEY_BLOCK;
1213
45.7k
  case CIL_BLOCKINHERIT:
1214
45.7k
    return CIL_KEY_BLOCKINHERIT;
1215
13
  case CIL_BLOCKABSTRACT:
1216
13
    return CIL_KEY_BLOCKABSTRACT;
1217
63
  case CIL_IN:
1218
63
    return CIL_KEY_IN;
1219
71
  case CIL_MACRO:
1220
71
    return CIL_KEY_MACRO;
1221
23.4k
  case CIL_CALL:
1222
23.4k
    return CIL_KEY_CALL;
1223
7.62k
  case CIL_OPTIONAL:
1224
7.62k
    return CIL_KEY_OPTIONAL;
1225
5
  case CIL_BOOL:
1226
5
    return CIL_KEY_BOOL;
1227
5.83k
  case CIL_BOOLEANIF:
1228
5.83k
    return CIL_KEY_BOOLEANIF;
1229
8
  case CIL_TUNABLE:
1230
8
    return CIL_KEY_TUNABLE;
1231
138
  case CIL_TUNABLEIF:
1232
138
    return CIL_KEY_TUNABLEIF;
1233
4.99k
  case CIL_CONDBLOCK:
1234
4.99k
    switch (((struct cil_condblock*)node->data)->flavor) {
1235
4.60k
    case CIL_CONDTRUE:
1236
4.60k
      return CIL_KEY_CONDTRUE;
1237
386
    case CIL_CONDFALSE:
1238
386
      return CIL_KEY_CONDFALSE;
1239
0
    default:
1240
0
      break;
1241
4.99k
    }
1242
0
    break;
1243
0
  case CIL_CONDTRUE:
1244
0
    return CIL_KEY_CONDTRUE;
1245
0
  case CIL_CONDFALSE:
1246
0
    return CIL_KEY_CONDFALSE;
1247
8
  case CIL_PERM:
1248
8
    return CIL_KEY_PERM;
1249
5
  case CIL_COMMON:
1250
5
    return CIL_KEY_COMMON;
1251
12
  case CIL_CLASS:
1252
12
    return CIL_KEY_CLASS;
1253
1
  case CIL_CLASSORDER:
1254
1
    return CIL_KEY_CLASSORDER;
1255
15
  case CIL_MAP_CLASS:
1256
15
    return CIL_KEY_MAP_CLASS;
1257
7
  case CIL_CLASSPERMISSION:
1258
7
    return CIL_KEY_CLASSPERMISSION;
1259
366
  case CIL_CLASSCOMMON:
1260
366
    return CIL_KEY_CLASSCOMMON;
1261
1.63k
  case CIL_CLASSMAPPING:
1262
1.63k
    return CIL_KEY_CLASSMAPPING;
1263
2.17k
  case CIL_CLASSPERMISSIONSET:
1264
2.17k
    return CIL_KEY_CLASSPERMISSIONSET;
1265
6
  case CIL_USER:
1266
6
    return CIL_KEY_USER;
1267
3
  case CIL_USERATTRIBUTE:
1268
3
    return CIL_KEY_USERATTRIBUTE;
1269
1.46k
  case CIL_USERATTRIBUTESET:
1270
1.46k
    return CIL_KEY_USERATTRIBUTESET;
1271
634
  case CIL_USERPREFIX:
1272
634
    return CIL_KEY_USERPREFIX;
1273
2.96k
  case CIL_USERROLE:
1274
2.96k
    return CIL_KEY_USERROLE;
1275
2.39k
  case CIL_USERLEVEL:
1276
2.39k
    return CIL_KEY_USERLEVEL;
1277
6.97k
  case CIL_USERRANGE:
1278
6.97k
    return CIL_KEY_USERRANGE;
1279
714
  case CIL_USERBOUNDS:
1280
714
    return CIL_KEY_USERBOUNDS;
1281
1.16k
  case CIL_SELINUXUSER:
1282
1.16k
    return CIL_KEY_SELINUXUSER;
1283
769
  case CIL_SELINUXUSERDEFAULT:
1284
769
    return CIL_KEY_SELINUXUSERDEFAULT;
1285
25
  case CIL_ROLE:
1286
25
    return CIL_KEY_ROLE;
1287
15
  case CIL_ROLEATTRIBUTE:
1288
15
    return CIL_KEY_ROLEATTRIBUTE;
1289
7.96k
  case CIL_ROLEATTRIBUTESET:
1290
7.96k
    return CIL_KEY_ROLEATTRIBUTESET;
1291
967
  case CIL_ROLETYPE:
1292
967
    return CIL_KEY_ROLETYPE;
1293
1.38k
  case CIL_ROLEBOUNDS:
1294
1.38k
    return CIL_KEY_ROLEBOUNDS;
1295
35
  case CIL_TYPE:
1296
35
    return CIL_KEY_TYPE;
1297
20
  case CIL_TYPEATTRIBUTE:
1298
20
    return CIL_KEY_TYPEATTRIBUTE;
1299
13
  case CIL_TYPEALIAS:
1300
13
    return CIL_KEY_TYPEALIAS;
1301
857
  case CIL_TYPEATTRIBUTESET:
1302
857
    return CIL_KEY_TYPEATTRIBUTESET;
1303
758
  case CIL_EXPANDTYPEATTRIBUTE:
1304
758
    return CIL_KEY_EXPANDTYPEATTRIBUTE;
1305
763
  case CIL_TYPEALIASACTUAL:
1306
763
    return CIL_KEY_TYPEALIASACTUAL;
1307
609
  case CIL_TYPEBOUNDS:
1308
609
    return CIL_KEY_TYPEBOUNDS;
1309
86
  case CIL_TYPEPERMISSIVE:
1310
86
    return CIL_KEY_TYPEPERMISSIVE;
1311
10
  case CIL_SENS:
1312
10
    return CIL_KEY_SENSITIVITY;
1313
10
  case CIL_SENSALIAS:
1314
10
    return CIL_KEY_SENSALIAS;
1315
336
  case CIL_SENSALIASACTUAL:
1316
336
    return CIL_KEY_SENSALIASACTUAL;
1317
959
  case CIL_SENSITIVITYORDER:
1318
959
    return CIL_KEY_SENSITIVITYORDER;
1319
2.72k
  case CIL_SENSCAT:
1320
2.72k
    return CIL_KEY_SENSCAT;
1321
7
  case CIL_CAT:
1322
7
    return CIL_KEY_CATEGORY;
1323
93
  case CIL_CATSET:
1324
93
    return CIL_KEY_CATSET;
1325
6
  case CIL_CATALIAS:
1326
6
    return CIL_KEY_CATALIAS;
1327
648
  case CIL_CATALIASACTUAL:
1328
648
    return CIL_KEY_CATALIASACTUAL;
1329
1.39k
  case CIL_CATORDER:
1330
1.39k
    return CIL_KEY_CATORDER;
1331
177
  case CIL_LEVEL:
1332
177
    return CIL_KEY_LEVEL;
1333
341
  case CIL_LEVELRANGE:
1334
341
    return CIL_KEY_LEVELRANGE;
1335
14
  case CIL_SID:
1336
14
    return CIL_KEY_SID;
1337
2.68k
  case CIL_SIDORDER:
1338
2.68k
    return CIL_KEY_SIDORDER;
1339
1.47k
  case CIL_ROLEALLOW:
1340
1.47k
    return CIL_KEY_ROLEALLOW;
1341
133k
  case CIL_AVRULE:
1342
133k
    switch (((struct cil_avrule *)node->data)->rule_kind) {
1343
72.7k
    case CIL_AVRULE_ALLOWED:
1344
72.7k
      return CIL_KEY_ALLOW;
1345
449
    case CIL_AVRULE_AUDITALLOW:
1346
449
      return CIL_KEY_AUDITALLOW;
1347
55.1k
    case CIL_AVRULE_DONTAUDIT:
1348
55.1k
      return CIL_KEY_DONTAUDIT;
1349
5.47k
    case CIL_AVRULE_NEVERALLOW:
1350
5.47k
      return CIL_KEY_NEVERALLOW;
1351
0
    default:
1352
0
      break;
1353
133k
    }
1354
0
    break;
1355
5.73k
  case CIL_AVRULEX:
1356
5.73k
    switch (((struct cil_avrule *)node->data)->rule_kind) {
1357
1.12k
    case CIL_AVRULE_ALLOWED:
1358
1.12k
      return CIL_KEY_ALLOWX;
1359
687
    case CIL_AVRULE_AUDITALLOW:
1360
687
      return CIL_KEY_AUDITALLOWX;
1361
3.20k
    case CIL_AVRULE_DONTAUDIT:
1362
3.20k
      return CIL_KEY_DONTAUDITX;
1363
717
    case CIL_AVRULE_NEVERALLOW:
1364
717
      return CIL_KEY_NEVERALLOWX;
1365
0
    default:
1366
0
      break;
1367
5.73k
    }
1368
0
    break;
1369
180
  case CIL_PERMISSIONX:
1370
180
    return CIL_KEY_PERMISSIONX;
1371
1.69k
  case CIL_DENY_RULE:
1372
1.69k
    return CIL_KEY_DENY_RULE;
1373
3.96k
  case CIL_ROLETRANSITION:
1374
3.96k
    return CIL_KEY_ROLETRANSITION;
1375
2.76k
  case CIL_TYPE_RULE:
1376
2.76k
    switch (((struct cil_type_rule *)node->data)->rule_kind) {
1377
2.04k
    case CIL_TYPE_TRANSITION:
1378
2.04k
      return CIL_KEY_TYPETRANSITION;
1379
508
    case CIL_TYPE_MEMBER:
1380
508
      return CIL_KEY_TYPEMEMBER;
1381
216
    case CIL_TYPE_CHANGE:
1382
216
      return CIL_KEY_TYPECHANGE;
1383
0
    default:
1384
0
      break;
1385
2.76k
    }
1386
0
    break;
1387
9.83k
  case CIL_NAMETYPETRANSITION:
1388
9.83k
    return CIL_KEY_TYPETRANSITION;
1389
8.08k
  case CIL_RANGETRANSITION:
1390
8.08k
    return CIL_KEY_RANGETRANSITION;
1391
3.71k
  case CIL_CONSTRAIN:
1392
3.71k
    return CIL_KEY_CONSTRAIN;
1393
798
  case CIL_MLSCONSTRAIN:
1394
798
    return CIL_KEY_MLSCONSTRAIN;
1395
1.08k
  case CIL_VALIDATETRANS:
1396
1.08k
    return CIL_KEY_VALIDATETRANS;
1397
455
  case CIL_MLSVALIDATETRANS:
1398
455
    return CIL_KEY_MLSVALIDATETRANS;
1399
1.90k
  case CIL_CONTEXT:
1400
1.90k
    return CIL_KEY_CONTEXT;
1401
4
  case CIL_IPADDR:
1402
4
    return CIL_KEY_IPADDR;
1403
1.41k
  case CIL_SIDCONTEXT:
1404
1.41k
    return CIL_KEY_SIDCONTEXT;
1405
12.1k
  case CIL_FSUSE:
1406
12.1k
    return CIL_KEY_FSUSE;
1407
4.26k
  case CIL_FILECON:
1408
4.26k
    return CIL_KEY_FILECON;
1409
3.60k
  case CIL_IBPKEYCON:
1410
3.60k
    return CIL_KEY_IBPKEYCON;
1411
5.24k
  case CIL_IBENDPORTCON:
1412
5.24k
    return CIL_KEY_IBENDPORTCON;
1413
5.72k
  case CIL_PORTCON:
1414
5.72k
    return CIL_KEY_PORTCON;
1415
5.99k
  case CIL_NODECON:
1416
5.99k
    return CIL_KEY_NODECON;
1417
3.34k
  case CIL_GENFSCON:
1418
3.34k
    return CIL_KEY_GENFSCON;
1419
4.15k
  case CIL_NETIFCON:
1420
4.15k
    return CIL_KEY_NETIFCON;
1421
16.3k
  case CIL_PIRQCON:
1422
16.3k
    return CIL_KEY_PIRQCON;
1423
4.08k
  case CIL_IOMEMCON:
1424
4.08k
    return CIL_KEY_IOMEMCON;
1425
5.17k
  case CIL_IOPORTCON:
1426
5.17k
    return CIL_KEY_IOPORTCON;
1427
5.57k
  case CIL_PCIDEVICECON:
1428
5.57k
    return CIL_KEY_PCIDEVICECON;
1429
1.97k
  case CIL_DEVICETREECON:
1430
1.97k
    return CIL_KEY_DEVICETREECON;
1431
6
  case CIL_POLICYCAP:
1432
6
    return CIL_KEY_POLICYCAP;
1433
1.39k
  case CIL_DEFAULTUSER:
1434
1.39k
    return CIL_KEY_DEFAULTUSER;
1435
13.5k
  case CIL_DEFAULTROLE:
1436
13.5k
    return CIL_KEY_DEFAULTROLE;
1437
910
  case CIL_DEFAULTTYPE:
1438
910
    return CIL_KEY_DEFAULTTYPE;
1439
456
  case CIL_DEFAULTRANGE:
1440
456
    return CIL_KEY_DEFAULTRANGE;
1441
0
  case CIL_HANDLEUNKNOWN:
1442
0
    return CIL_KEY_HANDLEUNKNOWN;
1443
1
  case CIL_MLS:
1444
1
    return CIL_KEY_MLS;
1445
10
  case CIL_SRC_INFO:
1446
10
    return CIL_KEY_SRC_INFO;
1447
0
  case CIL_ALL:
1448
0
    return CIL_KEY_ALL;
1449
0
  case CIL_RANGE:
1450
0
    return CIL_KEY_RANGE;
1451
0
  case CIL_AND:
1452
0
    return CIL_KEY_AND;
1453
0
  case CIL_OR:
1454
0
    return CIL_KEY_OR;
1455
0
  case CIL_XOR:
1456
0
    return CIL_KEY_XOR;
1457
0
  case CIL_NOT:
1458
0
    return CIL_KEY_NOT;
1459
0
  case CIL_EQ:
1460
0
    return CIL_KEY_EQ;
1461
0
  case CIL_NEQ:
1462
0
    return CIL_KEY_NEQ;
1463
0
  case CIL_CONS_DOM:
1464
0
    return CIL_KEY_CONS_DOM;
1465
0
  case CIL_CONS_DOMBY:
1466
0
    return CIL_KEY_CONS_DOMBY;
1467
0
  case CIL_CONS_INCOMP:
1468
0
    return CIL_KEY_CONS_INCOMP;
1469
0
  case CIL_CONS_U1:
1470
0
    return CIL_KEY_CONS_U1;
1471
0
  case CIL_CONS_U2:
1472
0
    return CIL_KEY_CONS_U2;
1473
0
  case CIL_CONS_U3:
1474
0
    return CIL_KEY_CONS_U3;
1475
0
  case CIL_CONS_T1:
1476
0
    return CIL_KEY_CONS_T1;
1477
0
  case CIL_CONS_T2:
1478
0
    return CIL_KEY_CONS_T2;
1479
0
  case CIL_CONS_T3:
1480
0
    return CIL_KEY_CONS_T3;
1481
0
  case CIL_CONS_R1:
1482
0
    return CIL_KEY_CONS_R1;
1483
0
  case CIL_CONS_R2:
1484
0
    return CIL_KEY_CONS_R2;
1485
0
  case CIL_CONS_R3:
1486
0
    return CIL_KEY_CONS_R3;
1487
0
  case CIL_CONS_L1:
1488
0
    return CIL_KEY_CONS_L1;
1489
0
  case CIL_CONS_L2:
1490
0
    return CIL_KEY_CONS_L2;
1491
0
  case CIL_CONS_H1:
1492
0
    return CIL_KEY_CONS_H1;
1493
0
  case CIL_CONS_H2:
1494
0
    return CIL_KEY_CONS_H2;
1495
1496
6
  default:
1497
6
    break;
1498
685k
  }
1499
1500
6
  return "<unknown>";
1501
685k
}
1502
1503
int cil_userprefixes_to_string(struct cil_db *db, char **out, size_t *size)
1504
0
{
1505
0
  int rc = SEPOL_ERR;
1506
0
  size_t str_len = 0;
1507
0
  int buf_pos = 0;
1508
0
  char *str_tmp = NULL;
1509
0
  struct cil_list_item *curr;
1510
0
  struct cil_userprefix *userprefix = NULL;
1511
0
  struct cil_user *user = NULL;
1512
1513
0
  *out = NULL;
1514
1515
0
  if (db->userprefixes->head == NULL) {
1516
0
    rc = SEPOL_OK;
1517
0
    *size = 0;
1518
0
    goto exit;
1519
0
  }
1520
1521
0
  cil_list_for_each(curr, db->userprefixes) {
1522
0
    userprefix = curr->data;
1523
0
    user = userprefix->user;
1524
0
    str_len += strlen("user ") + strlen(user->datum.fqn) + strlen(" prefix ") + strlen(userprefix->prefix_str) + 2;
1525
0
  }
1526
1527
0
  *size = str_len * sizeof(char);
1528
0
  str_len++;
1529
0
  str_tmp = cil_malloc(str_len * sizeof(char));
1530
0
  *out = str_tmp;
1531
1532
0
  cil_list_for_each(curr, db->userprefixes) {
1533
0
    userprefix = curr->data;
1534
0
    user = userprefix->user;
1535
1536
0
    buf_pos = snprintf(str_tmp, str_len, "user %s prefix %s;\n", user->datum.fqn,
1537
0
                  userprefix->prefix_str);
1538
0
    if (buf_pos < 0) {
1539
0
      free(str_tmp);
1540
0
      *size = 0;
1541
0
      *out = NULL;
1542
0
      goto exit;
1543
0
    }
1544
0
    str_len -= buf_pos;
1545
0
    str_tmp += buf_pos;
1546
0
  }
1547
1548
0
  rc = SEPOL_OK;
1549
0
exit:
1550
0
  return rc;
1551
1552
0
}
1553
1554
static int cil_cats_to_ebitmap(struct cil_cats *cats, struct ebitmap* cats_ebitmap)
1555
0
{
1556
0
  int rc = SEPOL_ERR;
1557
0
  struct cil_list_item *i;
1558
0
  struct cil_list_item *j;
1559
0
  struct cil_cat* cat;
1560
0
  struct cil_catset *cs;
1561
0
  struct cil_tree_node *node;
1562
1563
0
  if (cats == NULL) {
1564
0
    rc = SEPOL_OK;
1565
0
    goto exit;
1566
0
  }
1567
1568
0
  cil_list_for_each(i, cats->datum_expr) {
1569
0
    node = NODE(i->data);
1570
0
    if (node->flavor == CIL_CATSET) {
1571
0
      cs = (struct cil_catset*)i->data;
1572
0
      cil_list_for_each(j, cs->cats->datum_expr) {
1573
0
        cat = (struct cil_cat*)j->data;
1574
0
        rc = ebitmap_set_bit(cats_ebitmap, cat->value, 1);
1575
0
        if (rc != SEPOL_OK) {
1576
0
          goto exit;
1577
0
        }
1578
0
      }
1579
0
    } else {
1580
0
      cat = (struct cil_cat*)i->data;
1581
0
      rc = ebitmap_set_bit(cats_ebitmap, cat->value, 1);
1582
0
      if (rc != SEPOL_OK) {
1583
0
        goto exit;
1584
0
      }
1585
0
    }
1586
0
  }
1587
1588
0
  return SEPOL_OK;
1589
1590
0
exit:
1591
0
  return rc;
1592
0
}
1593
1594
static int cil_level_equals(struct cil_level *low, struct cil_level *high)
1595
0
{
1596
0
  int rc;
1597
0
  struct ebitmap elow;
1598
0
  struct ebitmap ehigh;
1599
1600
0
  if (strcmp(low->sens->datum.fqn, high->sens->datum.fqn)) {
1601
0
    rc = 0;
1602
0
    goto exit;
1603
0
  }
1604
1605
0
  ebitmap_init(&elow);
1606
0
  ebitmap_init(&ehigh);
1607
1608
0
  rc = cil_cats_to_ebitmap(low->cats, &elow);
1609
0
  if (rc != SEPOL_OK) {
1610
0
    goto exit;
1611
0
  }
1612
1613
0
  rc = cil_cats_to_ebitmap(high->cats, &ehigh);
1614
0
  if (rc != SEPOL_OK) {
1615
0
    goto exit;
1616
0
  }
1617
1618
0
  rc = ebitmap_cmp(&elow, &ehigh);
1619
0
  ebitmap_destroy(&elow);
1620
0
  ebitmap_destroy(&ehigh);
1621
1622
0
exit:
1623
0
  return rc;
1624
0
}
1625
1626
static int __cil_level_strlen(struct cil_level *lvl)
1627
0
{
1628
0
  struct cil_list_item *item;
1629
0
  struct cil_cats *cats = lvl->cats;
1630
0
  int str_len = 0;
1631
0
  char *str1 = NULL;
1632
0
  char *str2 = NULL;
1633
0
  int first = -1;
1634
0
  int last = -1;
1635
1636
0
  str_len += strlen(lvl->sens->datum.fqn);
1637
1638
0
  if (cats && cats->datum_expr != NULL) {
1639
0
    str_len++; /* initial ":" */
1640
0
    cil_list_for_each(item, cats->datum_expr) {
1641
0
      struct cil_cat *cat = item->data;
1642
0
      if (first == -1) {
1643
0
        str1 = cat->datum.fqn;
1644
0
        first = cat->value;
1645
0
        last = first;
1646
0
      } else if (cat->value == last + 1) {
1647
0
        last++;
1648
0
        str2 = cat->datum.fqn;
1649
0
      } else {
1650
0
        if (first == last) {
1651
0
          str_len += strlen(str1) + strlen(cat->datum.fqn) + 1;
1652
0
        } else if (last == first + 1) {
1653
0
          str_len += strlen(str1) + strlen(str2) + strlen(cat->datum.fqn) + 2;
1654
0
        } else {
1655
0
          str_len += strlen(str1) + strlen(str2) + strlen(cat->datum.fqn) + 2;
1656
0
        }
1657
0
        first = -1;
1658
0
        last = -1;
1659
0
        if (item->next != NULL) {
1660
0
          str_len++; /* space for "," after */
1661
0
        }
1662
0
      }
1663
0
    }
1664
0
    if (first != -1) {
1665
0
      if (first == last) {
1666
0
        str_len += strlen(str1);
1667
0
      } else if (last == first + 1) {
1668
0
        str_len += strlen(str1) + strlen(str2) + 1;
1669
0
      } else {
1670
0
        str_len += strlen(str1) + strlen(str2) + 1;
1671
0
      }
1672
0
    }
1673
0
  }
1674
1675
0
  return str_len;
1676
0
}
1677
1678
static int __cil_level_to_string(struct cil_level *lvl, char *out)
1679
0
{
1680
0
  struct cil_list_item *item;
1681
0
  struct cil_cats *cats = lvl->cats;
1682
0
  int buf_pos = 0;
1683
0
  char *str_tmp = out;
1684
0
  char *str1 = NULL;
1685
0
  char *str2 = NULL;
1686
0
  int first = -1;
1687
0
  int last = -1;
1688
1689
0
  buf_pos = sprintf(str_tmp, "%s", lvl->sens->datum.fqn);
1690
0
  str_tmp += buf_pos;
1691
1692
0
  if (cats && cats->datum_expr != NULL) {
1693
0
    buf_pos = sprintf(str_tmp, ":");
1694
0
    str_tmp += buf_pos;
1695
1696
0
    cil_list_for_each(item, cats->datum_expr) {
1697
0
      struct cil_cat *cat = item->data;
1698
0
      if (first == -1) {
1699
0
        str1 = cat->datum.fqn;
1700
0
        first = cat->value;
1701
0
        last = first;
1702
0
      } else if (cat->value == last + 1) {
1703
0
        last++;
1704
0
        str2 = cat->datum.fqn;
1705
0
      } else {
1706
0
        if (first == last) {
1707
0
          buf_pos = sprintf(str_tmp, "%s,%s", str1, cat->datum.fqn);
1708
0
          str_tmp += buf_pos;
1709
0
        } else if (last == first + 1) {
1710
0
          buf_pos = sprintf(str_tmp, "%s,%s,%s", str1, str2, cat->datum.fqn);
1711
0
          str_tmp += buf_pos;
1712
0
        } else {
1713
0
          buf_pos = sprintf(str_tmp, "%s.%s,%s",str1, str2, cat->datum.fqn);
1714
0
          str_tmp += buf_pos;
1715
0
        }
1716
0
        first = -1;
1717
0
        last = -1;
1718
0
        if (item->next != NULL) {
1719
0
          buf_pos = sprintf(str_tmp, ",");
1720
0
          str_tmp += buf_pos;
1721
0
        }
1722
0
      }
1723
0
    }
1724
0
    if (first != -1) {
1725
0
      if (first == last) {
1726
0
        buf_pos = sprintf(str_tmp, "%s", str1);
1727
0
        str_tmp += buf_pos;
1728
0
      } else if (last == first + 1) {
1729
0
        buf_pos = sprintf(str_tmp, "%s,%s", str1, str2);
1730
0
        str_tmp += buf_pos;
1731
0
      } else {
1732
0
        buf_pos = sprintf(str_tmp, "%s.%s",str1, str2);
1733
0
        str_tmp += buf_pos;
1734
0
      }
1735
0
    }
1736
0
  }
1737
1738
0
  return str_tmp - out;
1739
0
}
1740
1741
int cil_selinuxusers_to_string(struct cil_db *db, char **out, size_t *size)
1742
0
{
1743
0
  size_t str_len = 0;
1744
0
  int buf_pos = 0;
1745
0
  char *str_tmp = NULL;
1746
0
  struct cil_list_item *curr;
1747
1748
0
  if (db->selinuxusers->head == NULL) {
1749
0
    *size = 0;
1750
0
    *out = NULL;
1751
0
    return SEPOL_OK;
1752
0
  }
1753
1754
0
  cil_list_for_each(curr, db->selinuxusers) {
1755
0
    struct cil_selinuxuser *selinuxuser = curr->data;
1756
0
    struct cil_user *user = selinuxuser->user;
1757
1758
0
    str_len += strlen(selinuxuser->name_str) + strlen(user->datum.fqn) + 1;
1759
1760
0
    if (db->mls == CIL_TRUE) {
1761
0
      struct cil_levelrange *range = selinuxuser->range;
1762
0
      str_len += __cil_level_strlen(range->low) + __cil_level_strlen(range->high) + 2;
1763
0
    }
1764
1765
0
    str_len++;
1766
0
  }
1767
1768
0
  *size = str_len * sizeof(char);
1769
0
  str_tmp = cil_malloc(*size+1);
1770
0
  *out = str_tmp;
1771
1772
0
  for(curr = db->selinuxusers->head; curr != NULL; curr = curr->next) {
1773
0
    struct cil_selinuxuser *selinuxuser = curr->data;
1774
0
    struct cil_user *user = selinuxuser->user;
1775
1776
0
    buf_pos = sprintf(str_tmp, "%s:%s", selinuxuser->name_str, user->datum.fqn);
1777
0
    str_tmp += buf_pos;
1778
1779
0
    if (db->mls == CIL_TRUE) {
1780
0
      struct cil_levelrange *range = selinuxuser->range;
1781
0
      buf_pos = sprintf(str_tmp, ":");
1782
0
      str_tmp += buf_pos;
1783
0
      buf_pos = __cil_level_to_string(range->low, str_tmp);
1784
0
      str_tmp += buf_pos;
1785
0
      buf_pos = sprintf(str_tmp, "-");
1786
0
      str_tmp += buf_pos;
1787
0
      buf_pos = __cil_level_to_string(range->high, str_tmp);
1788
0
      str_tmp += buf_pos;
1789
0
    }
1790
1791
0
    buf_pos = sprintf(str_tmp, "\n");
1792
0
    str_tmp += buf_pos;
1793
0
  }
1794
1795
0
  return SEPOL_OK;
1796
0
}
1797
1798
int cil_filecons_to_string(struct cil_db *db, char **out, size_t *size)
1799
0
{
1800
0
  uint32_t i = 0;
1801
0
  int buf_pos = 0;
1802
0
  size_t str_len = 0;
1803
0
  char *str_tmp = NULL;
1804
0
  struct cil_sort *filecons = db->filecon;
1805
1806
0
  for (i = 0; i < filecons->count; i++) {
1807
0
    struct cil_filecon *filecon = filecons->array[i];
1808
0
    struct cil_context *ctx = filecon->context;
1809
0
    char *path_str = filecon->path ? DATUM(filecon->path)->fqn : filecon->path_str;
1810
0
    str_len += strlen(path_str);
1811
1812
0
    if (filecon->type != CIL_FILECON_ANY) {
1813
      /* If a type is specified,
1814
         +2 for type string, +1 for tab */
1815
0
      str_len += 3;
1816
0
    }
1817
1818
0
    if (ctx != NULL) {
1819
0
      struct cil_user *user = ctx->user;
1820
0
      struct cil_role *role = ctx->role;
1821
0
      struct cil_type *type = ctx->type;
1822
1823
0
      str_len += (strlen(user->datum.fqn) + strlen(role->datum.fqn) + strlen(type->datum.fqn) + 3);
1824
1825
0
      if (db->mls == CIL_TRUE) {
1826
0
        struct cil_levelrange *range = ctx->range;
1827
0
        if (cil_level_equals(range->low, range->high)) {
1828
0
          str_len += __cil_level_strlen(range->low) + 1;
1829
0
        } else {
1830
0
          str_len += __cil_level_strlen(range->low) + __cil_level_strlen(range->high) + 2;
1831
0
        }
1832
0
      }
1833
0
    } else {
1834
0
      str_len += strlen("\t<<none>>");
1835
0
    }
1836
1837
0
    str_len++;
1838
0
  }
1839
1840
0
  *size = str_len * sizeof(char);
1841
0
  str_tmp = cil_malloc(*size+1);
1842
0
  *out = str_tmp;
1843
1844
0
  for (i = 0; i < filecons->count; i++) {
1845
0
    struct cil_filecon *filecon = filecons->array[i];
1846
0
    struct cil_context *ctx = filecon->context;
1847
0
    const char *str_type = NULL;
1848
0
    char *path_str = filecon->path ? DATUM(filecon->path)->fqn : filecon->path_str;
1849
0
    buf_pos = sprintf(str_tmp, "%s", path_str);
1850
0
    str_tmp += buf_pos;
1851
1852
0
    switch(filecon->type) {
1853
0
    case CIL_FILECON_ANY:
1854
0
      str_type = "";
1855
0
      break;
1856
0
    case CIL_FILECON_FILE:
1857
0
      str_type = "\t--";
1858
0
      break;
1859
0
    case CIL_FILECON_DIR:
1860
0
      str_type = "\t-d";
1861
0
      break;
1862
0
    case CIL_FILECON_CHAR:
1863
0
      str_type = "\t-c";
1864
0
      break;
1865
0
    case CIL_FILECON_BLOCK:
1866
0
      str_type = "\t-b";
1867
0
      break;
1868
0
    case CIL_FILECON_SOCKET:
1869
0
      str_type = "\t-s";
1870
0
      break;
1871
0
    case CIL_FILECON_PIPE:
1872
0
      str_type = "\t-p";
1873
0
      break;
1874
0
    case CIL_FILECON_SYMLINK:
1875
0
      str_type = "\t-l";
1876
0
      break;
1877
0
    default:
1878
0
      str_type = "";
1879
0
      break;
1880
0
    }
1881
0
    buf_pos = sprintf(str_tmp, "%s", str_type);
1882
0
    str_tmp += buf_pos;
1883
1884
0
    if (ctx != NULL) {
1885
0
      struct cil_user *user = ctx->user;
1886
0
      struct cil_role *role = ctx->role;
1887
0
      struct cil_type *type = ctx->type;
1888
1889
0
      buf_pos = sprintf(str_tmp, "\t%s:%s:%s", user->datum.fqn, role->datum.fqn,
1890
0
                type->datum.fqn);
1891
0
      str_tmp += buf_pos;
1892
1893
0
      if (db->mls == CIL_TRUE) {
1894
0
        struct cil_levelrange *range = ctx->range;
1895
0
        buf_pos = sprintf(str_tmp, ":");
1896
0
        str_tmp += buf_pos;
1897
0
        buf_pos = __cil_level_to_string(range->low, str_tmp);
1898
0
        str_tmp += buf_pos;
1899
1900
0
        if (!cil_level_equals(range->low, range->high)) {
1901
0
          buf_pos = sprintf(str_tmp, "-");
1902
0
          str_tmp += buf_pos;
1903
0
          buf_pos = __cil_level_to_string(range->high, str_tmp);
1904
0
          str_tmp += buf_pos;
1905
0
        }
1906
0
      }
1907
0
    } else {
1908
0
      buf_pos = sprintf(str_tmp, "\t<<none>>");
1909
0
      str_tmp += buf_pos;
1910
0
    }
1911
1912
0
    buf_pos = sprintf(str_tmp, "\n");
1913
0
    str_tmp += buf_pos;
1914
0
  }
1915
1916
0
  return SEPOL_OK;
1917
0
}
1918
1919
void cil_set_disable_dontaudit(struct cil_db *db, int disable_dontaudit)
1920
11.8k
{
1921
11.8k
  db->disable_dontaudit = disable_dontaudit;
1922
11.8k
}
1923
1924
void cil_set_disable_neverallow(struct cil_db *db, int disable_neverallow)
1925
11.8k
{
1926
11.8k
  db->disable_neverallow = disable_neverallow;
1927
11.8k
}
1928
1929
void cil_set_attrs_expand_generated(struct cil_db *db, int attrs_expand_generated)
1930
11.8k
{
1931
11.8k
  db->attrs_expand_generated = attrs_expand_generated;
1932
11.8k
}
1933
1934
void cil_set_attrs_expand_size(struct cil_db *db, unsigned attrs_expand_size)
1935
0
{
1936
0
  db->attrs_expand_size = attrs_expand_size;
1937
0
}
1938
1939
void cil_set_preserve_tunables(struct cil_db *db, int preserve_tunables)
1940
11.8k
{
1941
11.8k
  db->preserve_tunables = preserve_tunables;
1942
11.8k
}
1943
1944
int cil_set_handle_unknown(struct cil_db *db, int handle_unknown)
1945
0
{
1946
0
  int rc = 0;
1947
1948
0
  switch (handle_unknown) {
1949
0
    case SEPOL_DENY_UNKNOWN:
1950
0
    case SEPOL_REJECT_UNKNOWN:
1951
0
    case SEPOL_ALLOW_UNKNOWN:
1952
0
      db->handle_unknown = handle_unknown;
1953
0
      break;
1954
0
    default:
1955
0
      cil_log(CIL_ERR, "Unknown value for handle-unknown: %i\n", handle_unknown);
1956
0
      rc = -1;
1957
0
  }
1958
1959
0
  return rc;
1960
0
}
1961
1962
void cil_set_mls(struct cil_db *db, int mls)
1963
11.8k
{
1964
11.8k
  db->mls = mls;
1965
11.8k
}
1966
1967
void cil_set_multiple_decls(struct cil_db *db, int multiple_decls)
1968
11.8k
{
1969
11.8k
  db->multiple_decls = multiple_decls;
1970
11.8k
}
1971
1972
void cil_set_qualified_names(struct cil_db *db, int qualified_names)
1973
0
{
1974
0
  db->qualified_names = qualified_names;
1975
0
}
1976
1977
void cil_set_target_platform(struct cil_db *db, int target_platform)
1978
11.8k
{
1979
11.8k
  db->target_platform = target_platform;
1980
11.8k
}
1981
1982
void cil_set_policy_version(struct cil_db *db, int policy_version)
1983
11.8k
{
1984
11.8k
  db->policy_version = policy_version;
1985
11.8k
}
1986
1987
void cil_symtab_array_init(symtab_t symtab[], const int symtab_sizes[CIL_SYM_NUM])
1988
599k
{
1989
599k
  uint32_t i = 0;
1990
11.9M
  for (i = 0; i < CIL_SYM_NUM; i++) {
1991
11.3M
    cil_symtab_init(&symtab[i], symtab_sizes[i]);
1992
11.3M
  }
1993
599k
}
1994
1995
void cil_symtab_array_destroy(symtab_t symtab[])
1996
599k
{
1997
599k
  int i = 0;
1998
11.9M
  for (i = 0; i < CIL_SYM_NUM; i++) {
1999
11.3M
    cil_symtab_destroy(&symtab[i]);
2000
11.3M
  }
2001
599k
}
2002
2003
void cil_destroy_ast_symtabs(struct cil_tree_node *current)
2004
0
{
2005
0
  while (current) {
2006
0
    switch (current->flavor) {
2007
0
    case CIL_BLOCK:
2008
0
      cil_symtab_array_destroy(((struct cil_block*)current->data)->symtab);
2009
0
      break;
2010
0
    case CIL_IN:
2011
0
      cil_symtab_array_destroy(((struct cil_in*)current->data)->symtab);
2012
0
      break;
2013
0
    case CIL_CLASS:
2014
0
    case CIL_COMMON:
2015
0
    case CIL_MAP_CLASS:
2016
0
      cil_symtab_destroy(&((struct cil_class*)current->data)->perms);
2017
0
      break;
2018
0
    case CIL_MACRO:
2019
0
      cil_symtab_array_destroy(((struct cil_macro*)current->data)->symtab);
2020
0
      break;
2021
0
    case CIL_CONDBLOCK:
2022
0
      cil_symtab_array_destroy(((struct cil_condblock*)current->data)->symtab);
2023
0
      break;
2024
0
    default:
2025
0
      break;
2026
0
    }
2027
2028
0
    if (current->cl_head) {
2029
0
      cil_destroy_ast_symtabs(current->cl_head);
2030
0
    }
2031
2032
0
    current = current->next;
2033
0
  }
2034
0
}
2035
2036
int cil_get_symtab(struct cil_tree_node *ast_node, symtab_t **symtab, enum cil_sym_index sym_index)
2037
1.61M
{
2038
1.61M
  struct cil_tree_node *node = ast_node;
2039
1.61M
  *symtab = NULL;
2040
  
2041
1.61M
  if (sym_index == CIL_SYM_PERMS) {
2042
    /* Class statements are not blocks, so the passed node should be the class */
2043
134k
    if (node->flavor == CIL_CLASS || node->flavor == CIL_MAP_CLASS ||
2044
134k
      node->flavor == CIL_COMMON) {
2045
134k
      *symtab = &((struct cil_class*)node->data)->perms;
2046
134k
      return SEPOL_OK;
2047
134k
    }
2048
0
    goto exit;
2049
134k
  }
2050
2051
1.47M
  if (sym_index < CIL_SYM_BLOCKS || sym_index >= CIL_SYM_NUM) {
2052
0
    cil_log(CIL_ERR, "Invalid symtab type\n");
2053
0
    goto exit;
2054
0
  }
2055
2056
4.55M
  while (node != NULL && *symtab == NULL) {
2057
3.07M
    switch (node->flavor) {
2058
462k
    case CIL_ROOT:
2059
462k
      *symtab = &((struct cil_root *)node->data)->symtab[sym_index];
2060
462k
      break;
2061
971k
    case CIL_BLOCK:
2062
971k
      *symtab = &((struct cil_block*)node->data)->symtab[sym_index];
2063
971k
      break;
2064
11.5k
    case CIL_MACRO:
2065
11.5k
      *symtab = &((struct cil_macro*)node->data)->symtab[sym_index];
2066
11.5k
      break;
2067
27.3k
    case CIL_IN:
2068
      /* In blocks only exist before resolving the AST */
2069
27.3k
      *symtab = &((struct cil_in*)node->data)->symtab[sym_index];
2070
27.3k
      break;
2071
4.21k
    case CIL_CONDBLOCK: {
2072
4.21k
      if (node->parent->flavor == CIL_TUNABLEIF) {
2073
        /* Cond blocks only exist before resolving the AST */
2074
4.17k
        *symtab = &((struct cil_condblock*)node->data)->symtab[sym_index];
2075
4.17k
      } else if (node->parent->flavor == CIL_BOOLEANIF) {
2076
42
        node = node->parent->parent;
2077
42
      }
2078
4.21k
      break;
2079
0
    }
2080
1.59M
    default:
2081
1.59M
      node = node->parent;
2082
3.07M
    }
2083
3.07M
  }
2084
2085
1.47M
  if (*symtab == NULL) {
2086
0
    goto exit;
2087
0
  }
2088
2089
1.47M
  return SEPOL_OK;
2090
2091
0
exit:
2092
0
  cil_tree_log(ast_node, CIL_ERR, "Failed to get symtab from node");
2093
0
  return SEPOL_ERR; 
2094
1.47M
}
2095
2096
int cil_string_to_uint32(const char *string, uint32_t *value, int base)
2097
37.9k
{
2098
37.9k
  unsigned long val;
2099
37.9k
  char *end = NULL;
2100
37.9k
  int rc = SEPOL_ERR;
2101
2102
37.9k
  if (string == NULL || value  == NULL) {
2103
6
    goto exit;
2104
6
  }
2105
2106
37.9k
  errno = 0;
2107
37.9k
  val = strtoul(string, &end, base);
2108
37.9k
  if (errno != 0 || end == string || *end != '\0') {
2109
47
    rc = SEPOL_ERR;
2110
47
    goto exit;
2111
47
  }
2112
2113
  /* Ensure that the value fits a 32-bit integer without triggering -Wtype-limits */
2114
37.9k
#if ULONG_MAX > UINT32_MAX
2115
37.9k
  if (val > UINT32_MAX) {
2116
69
    rc = SEPOL_ERR;
2117
69
    goto exit;
2118
69
  }
2119
37.8k
#endif
2120
2121
37.8k
  *value = val;
2122
2123
37.8k
  return SEPOL_OK;
2124
2125
122
exit:
2126
122
  cil_log(CIL_ERR, "Failed to create uint32_t from string\n");
2127
122
  return rc;
2128
37.9k
}
2129
2130
int cil_string_to_uint64(const char *string, uint64_t *value, int base)
2131
4.69k
{
2132
4.69k
  char *end = NULL;
2133
4.69k
  int rc = SEPOL_ERR;
2134
2135
4.69k
  if (string == NULL || value  == NULL) {
2136
0
    goto exit;
2137
0
  }
2138
2139
4.69k
  errno = 0;
2140
4.69k
  *value = strtoull(string, &end, base);
2141
4.69k
  if (errno != 0 || end == string || *end != '\0') {
2142
12
    rc = SEPOL_ERR;
2143
12
    goto exit;
2144
12
  }
2145
2146
4.67k
  return SEPOL_OK;
2147
2148
12
exit:
2149
12
  cil_log(CIL_ERR, "Failed to create uint64_t from string\n");
2150
12
  return rc;
2151
4.69k
}
2152
2153
void cil_sort_init(struct cil_sort **sort)
2154
154k
{
2155
154k
  *sort = cil_malloc(sizeof(**sort));
2156
2157
154k
  (*sort)->flavor = CIL_NONE;
2158
154k
  (*sort)->count = 0;
2159
154k
  (*sort)->index = 0;
2160
154k
  (*sort)->array = NULL;
2161
154k
}
2162
2163
void cil_sort_destroy(struct cil_sort **sort)
2164
154k
{
2165
154k
  (*sort)->flavor = CIL_NONE;
2166
154k
  (*sort)->count = 0;
2167
154k
  (*sort)->index = 0;
2168
154k
  if ((*sort)->array != NULL) {
2169
2.80k
    free((*sort)->array);
2170
2.80k
  }
2171
154k
  (*sort)->array = NULL;
2172
2173
154k
  free(*sort);
2174
154k
  *sort = NULL;
2175
154k
}
2176
2177
void cil_ordered_init(struct cil_ordered **ordered)
2178
135k
{
2179
135k
  *ordered = cil_malloc(sizeof(**ordered));
2180
135k
  (*ordered)->merged = CIL_FALSE;
2181
135k
  (*ordered)->strs = NULL;
2182
135k
  (*ordered)->datums = NULL;
2183
135k
}
2184
2185
void cil_netifcon_init(struct cil_netifcon **netifcon)
2186
8.39k
{
2187
8.39k
  *netifcon = cil_malloc(sizeof(**netifcon));
2188
2189
8.39k
  (*netifcon)->interface_str = NULL;
2190
8.39k
  (*netifcon)->if_context_str = NULL;
2191
8.39k
  (*netifcon)->if_context = NULL;
2192
8.39k
  (*netifcon)->packet_context_str = NULL;
2193
8.39k
  (*netifcon)->packet_context = NULL;
2194
8.39k
  (*netifcon)->context_str = NULL;
2195
8.39k
}
2196
2197
void cil_ibendportcon_init(struct cil_ibendportcon **ibendportcon)
2198
10.4k
{
2199
10.4k
  *ibendportcon = cil_malloc(sizeof(**ibendportcon));
2200
2201
10.4k
  (*ibendportcon)->dev_name_str = NULL;
2202
10.4k
  (*ibendportcon)->port = 0;
2203
10.4k
  (*ibendportcon)->context_str = NULL;
2204
10.4k
  (*ibendportcon)->context = NULL;
2205
10.4k
}
2206
2207
void cil_context_init(struct cil_context **context)
2208
2.30M
{
2209
2.30M
  *context = cil_malloc(sizeof(**context));
2210
2211
2.30M
  cil_symtab_datum_init(&(*context)->datum);
2212
2.30M
  (*context)->user_str = NULL;
2213
2.30M
  (*context)->user = NULL;
2214
2.30M
  (*context)->role_str = NULL;
2215
2.30M
  (*context)->role = NULL;
2216
2.30M
  (*context)->type_str = NULL;
2217
2.30M
  (*context)->type = NULL;
2218
2.30M
  (*context)->range_str = NULL;
2219
2.30M
  (*context)->range = NULL;
2220
2.30M
}
2221
2222
void cil_level_init(struct cil_level **level)
2223
4.68M
{
2224
4.68M
  *level = cil_malloc(sizeof(**level));
2225
2226
4.68M
  cil_symtab_datum_init(&(*level)->datum);
2227
4.68M
  (*level)->sens_str = NULL;
2228
4.68M
  (*level)->sens = NULL;
2229
4.68M
  (*level)->cats = NULL;
2230
4.68M
}
2231
2232
void cil_levelrange_init(struct cil_levelrange **range)
2233
2.34M
{
2234
2.34M
  *range = cil_malloc(sizeof(**range));
2235
2236
2.34M
  cil_symtab_datum_init(&(*range)->datum);
2237
2.34M
  (*range)->low_str = NULL;
2238
2.34M
  (*range)->low = NULL;
2239
2.34M
  (*range)->high_str = NULL;
2240
2.34M
  (*range)->high = NULL;
2241
2.34M
}
2242
2243
void cil_sens_init(struct cil_sens **sens)
2244
5.29k
{
2245
5.29k
  *sens = cil_malloc(sizeof(**sens));
2246
2247
5.29k
  cil_symtab_datum_init(&(*sens)->datum);
2248
2249
5.29k
  (*sens)->cats_list = NULL;
2250
2251
5.29k
  (*sens)->ordered = CIL_FALSE;
2252
5.29k
}
2253
2254
void cil_block_init(struct cil_block **block)
2255
355k
{
2256
355k
  *block = cil_malloc(sizeof(**block));
2257
2258
355k
  cil_symtab_datum_init(&(*block)->datum);
2259
2260
355k
  cil_symtab_array_init((*block)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_BLOCK]);
2261
2262
355k
  (*block)->is_abstract = CIL_FALSE;
2263
2264
355k
  (*block)->bi_nodes = NULL;
2265
355k
}
2266
2267
void cil_blockinherit_init(struct cil_blockinherit **inherit)
2268
152k
{
2269
152k
  *inherit = cil_malloc(sizeof(**inherit));
2270
152k
  (*inherit)->block_str = NULL;
2271
152k
  (*inherit)->block = NULL;
2272
152k
}
2273
2274
void cil_blockabstract_init(struct cil_blockabstract **abstract)
2275
786
{
2276
786
  *abstract = cil_malloc(sizeof(**abstract));
2277
786
  (*abstract)->block_str = NULL;
2278
786
  (*abstract)->block = NULL;
2279
786
}
2280
2281
void cil_in_init(struct cil_in **in)
2282
17.2k
{
2283
17.2k
  *in = cil_malloc(sizeof(**in));
2284
2285
17.2k
  cil_symtab_array_init((*in)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_IN]);
2286
17.2k
  (*in)->is_after = CIL_FALSE;
2287
17.2k
  (*in)->block_str = NULL;
2288
17.2k
  (*in)->block = NULL;
2289
17.2k
}
2290
2291
void cil_class_init(struct cil_class **class)
2292
38.0k
{
2293
38.0k
  *class = cil_malloc(sizeof(**class));
2294
2295
38.0k
  cil_symtab_datum_init(&(*class)->datum);
2296
2297
38.0k
  cil_symtab_init(&(*class)->perms, CIL_CLASS_SYM_SIZE);
2298
2299
38.0k
  (*class)->num_perms = 0;
2300
38.0k
  (*class)->common = NULL;
2301
38.0k
  (*class)->ordered = CIL_FALSE;
2302
38.0k
}
2303
2304
void cil_classcommon_init(struct cil_classcommon **classcommon)
2305
4.75k
{
2306
4.75k
  *classcommon = cil_malloc(sizeof(**classcommon));
2307
2308
4.75k
  (*classcommon)->class_str = NULL;
2309
4.75k
  (*classcommon)->class = NULL;
2310
4.75k
  (*classcommon)->common_str = NULL;
2311
4.75k
  (*classcommon)->common = NULL;
2312
4.75k
}
2313
2314
void cil_sid_init(struct cil_sid **sid)
2315
12.3k
{
2316
12.3k
  *sid = cil_malloc(sizeof(**sid));
2317
2318
12.3k
  cil_symtab_datum_init(&(*sid)->datum);
2319
2320
12.3k
  (*sid)->ordered = CIL_FALSE;
2321
12.3k
  (*sid)->context = NULL;
2322
12.3k
}
2323
2324
void cil_sidcontext_init(struct cil_sidcontext **sidcontext)
2325
5.72k
{
2326
5.72k
  *sidcontext = cil_malloc(sizeof(**sidcontext));
2327
2328
5.72k
  (*sidcontext)->sid_str = NULL;
2329
5.72k
  (*sidcontext)->sid = NULL;
2330
5.72k
  (*sidcontext)->context_str = NULL;
2331
5.72k
  (*sidcontext)->context = NULL;
2332
5.72k
}
2333
2334
void cil_userrole_init(struct cil_userrole **userrole)
2335
13.0k
{
2336
13.0k
  *userrole = cil_malloc(sizeof(**userrole));
2337
2338
13.0k
  (*userrole)->user_str = NULL;
2339
13.0k
  (*userrole)->user = NULL;
2340
13.0k
  (*userrole)->role_str = NULL;
2341
13.0k
  (*userrole)->role = NULL;
2342
13.0k
}
2343
2344
void cil_userprefix_init(struct cil_userprefix **userprefix)
2345
2.68k
{
2346
2.68k
  *userprefix = cil_malloc(sizeof(**userprefix));
2347
2348
2.68k
  (*userprefix)->user_str = NULL;
2349
2.68k
  (*userprefix)->user = NULL;
2350
2.68k
  (*userprefix)->prefix_str = NULL;
2351
2.68k
}
2352
2353
void cil_selinuxuser_init(struct cil_selinuxuser **selinuxuser)
2354
3.89k
{
2355
3.89k
  *selinuxuser = cil_malloc(sizeof(**selinuxuser));
2356
2357
3.89k
  (*selinuxuser)->name_str = NULL;
2358
3.89k
  (*selinuxuser)->user_str = NULL;
2359
3.89k
  (*selinuxuser)->user = NULL;
2360
3.89k
  (*selinuxuser)->range_str = NULL;
2361
3.89k
  (*selinuxuser)->range = NULL;
2362
3.89k
}
2363
2364
void cil_roletype_init(struct cil_roletype **roletype)
2365
28.2k
{
2366
28.2k
  *roletype = cil_malloc(sizeof(**roletype));
2367
2368
28.2k
  (*roletype)->role_str = NULL;
2369
28.2k
  (*roletype)->role = NULL;
2370
28.2k
  (*roletype)->type_str = NULL;
2371
28.2k
  (*roletype)->type = NULL;
2372
28.2k
}
2373
2374
void cil_roleattribute_init(struct cil_roleattribute **attr)
2375
7.62k
{
2376
7.62k
  *attr = cil_malloc(sizeof(**attr));
2377
2378
7.62k
  cil_symtab_datum_init(&(*attr)->datum);
2379
2380
7.62k
  (*attr)->expr_list = NULL;
2381
7.62k
  (*attr)->roles = NULL;
2382
7.62k
}
2383
2384
void cil_roleattributeset_init(struct cil_roleattributeset **attrset)
2385
15.6k
{
2386
15.6k
  *attrset = cil_malloc(sizeof(**attrset));
2387
2388
15.6k
  (*attrset)->attr_str = NULL;
2389
15.6k
  (*attrset)->attr = NULL;
2390
15.6k
  (*attrset)->str_expr = NULL;
2391
15.6k
  (*attrset)->datum_expr = NULL;
2392
15.6k
}
2393
2394
void cil_typeattribute_init(struct cil_typeattribute **attr)
2395
120k
{
2396
120k
  *attr = cil_malloc(sizeof(**attr));
2397
2398
120k
  cil_symtab_datum_init(&(*attr)->datum);
2399
2400
120k
  (*attr)->expr_list = NULL;
2401
120k
  (*attr)->types = NULL;
2402
120k
  (*attr)->used = CIL_FALSE;
2403
120k
  (*attr)->keep = CIL_FALSE;
2404
120k
}
2405
2406
void cil_typeattributeset_init(struct cil_typeattributeset **attrset)
2407
111k
{
2408
111k
  *attrset = cil_malloc(sizeof(**attrset));
2409
2410
111k
  (*attrset)->attr_str = NULL;
2411
111k
  (*attrset)->attr = NULL;
2412
111k
  (*attrset)->str_expr = NULL;
2413
111k
  (*attrset)->datum_expr = NULL;
2414
111k
}
2415
2416
void cil_expandtypeattribute_init(struct cil_expandtypeattribute **expandattr)
2417
1.68k
{
2418
1.68k
  *expandattr = cil_malloc(sizeof(**expandattr));
2419
2420
1.68k
  (*expandattr)->attr_strs = NULL;
2421
1.68k
  (*expandattr)->attr_datums = NULL;
2422
1.68k
  (*expandattr)->expand = 0;
2423
1.68k
}
2424
2425
void cil_alias_init(struct cil_alias **alias)
2426
4.31k
{
2427
4.31k
  *alias = cil_malloc(sizeof(**alias));
2428
2429
4.31k
  (*alias)->actual = NULL;
2430
2431
4.31k
  cil_symtab_datum_init(&(*alias)->datum);
2432
4.31k
}
2433
2434
void cil_aliasactual_init(struct cil_aliasactual **aliasactual)
2435
6.22k
{
2436
6.22k
  *aliasactual = cil_malloc(sizeof(**aliasactual));
2437
2438
6.22k
  (*aliasactual)->alias_str = NULL;
2439
6.22k
  (*aliasactual)->alias = NULL;
2440
6.22k
  (*aliasactual)->actual_str = NULL;
2441
6.22k
  (*aliasactual)->actual = NULL;
2442
6.22k
}
2443
2444
void cil_typepermissive_init(struct cil_typepermissive **typeperm)
2445
4.07k
{
2446
4.07k
  *typeperm = cil_malloc(sizeof(**typeperm));
2447
2448
4.07k
  (*typeperm)->type_str = NULL;
2449
4.07k
  (*typeperm)->type = NULL;
2450
4.07k
}
2451
2452
void cil_nametypetransition_init(struct cil_nametypetransition **nametypetrans)
2453
90.0k
{
2454
90.0k
  *nametypetrans = cil_malloc(sizeof(**nametypetrans));
2455
2456
90.0k
  (*nametypetrans)->src_str = NULL;
2457
90.0k
  (*nametypetrans)->src = NULL;
2458
90.0k
  (*nametypetrans)->tgt_str = NULL;
2459
90.0k
  (*nametypetrans)->tgt = NULL;
2460
90.0k
  (*nametypetrans)->obj_str = NULL;
2461
90.0k
  (*nametypetrans)->obj = NULL;
2462
90.0k
  (*nametypetrans)->name_str = NULL;
2463
90.0k
  (*nametypetrans)->name = NULL;
2464
90.0k
  (*nametypetrans)->result_str = NULL;
2465
90.0k
  (*nametypetrans)->result = NULL;
2466
90.0k
}
2467
2468
void cil_rangetransition_init(struct cil_rangetransition **rangetrans)
2469
25.5k
{
2470
25.5k
        *rangetrans = cil_malloc(sizeof(**rangetrans));
2471
2472
25.5k
  (*rangetrans)->src_str = NULL;
2473
25.5k
  (*rangetrans)->src = NULL;
2474
25.5k
  (*rangetrans)->exec_str = NULL;
2475
25.5k
  (*rangetrans)->exec = NULL;
2476
25.5k
  (*rangetrans)->obj_str = NULL;
2477
25.5k
  (*rangetrans)->obj = NULL;
2478
25.5k
  (*rangetrans)->range_str = NULL;
2479
25.5k
  (*rangetrans)->range = NULL;
2480
25.5k
}
2481
2482
void cil_bool_init(struct cil_bool **cilbool)
2483
12.4k
{
2484
12.4k
  *cilbool = cil_malloc(sizeof(**cilbool));
2485
2486
12.4k
  cil_symtab_datum_init(&(*cilbool)->datum);
2487
12.4k
  (*cilbool)->value = 0;
2488
12.4k
}
2489
2490
void cil_tunable_init(struct cil_tunable **ciltun)
2491
1.31k
{
2492
1.31k
  *ciltun = cil_malloc(sizeof(**ciltun));
2493
2494
1.31k
  cil_symtab_datum_init(&(*ciltun)->datum);
2495
1.31k
  (*ciltun)->value = 0;
2496
1.31k
}
2497
2498
void cil_condblock_init(struct cil_condblock **cb)
2499
196k
{
2500
196k
  *cb = cil_malloc(sizeof(**cb));
2501
2502
196k
  (*cb)->flavor = CIL_NONE;
2503
196k
  cil_symtab_array_init((*cb)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_CONDBLOCK]);
2504
196k
}
2505
2506
void cil_boolif_init(struct cil_booleanif **bif)
2507
189k
{
2508
189k
  *bif = cil_malloc(sizeof(**bif));
2509
2510
189k
  (*bif)->str_expr = NULL;
2511
189k
  (*bif)->datum_expr = NULL;
2512
189k
}
2513
2514
void cil_tunif_init(struct cil_tunableif **tif)
2515
5.25k
{
2516
5.25k
  *tif = cil_malloc(sizeof(**tif));
2517
2518
5.25k
  (*tif)->str_expr = NULL;
2519
5.25k
  (*tif)->datum_expr = NULL;
2520
5.25k
}
2521
2522
void cil_avrule_init(struct cil_avrule **avrule)
2523
1.06M
{
2524
1.06M
  *avrule = cil_malloc(sizeof(**avrule));
2525
2526
1.06M
  (*avrule)->is_extended = 0;
2527
1.06M
  (*avrule)->rule_kind = CIL_NONE;
2528
1.06M
  (*avrule)->src_str = NULL;
2529
1.06M
  (*avrule)->src = NULL;
2530
1.06M
  (*avrule)->tgt_str = NULL;
2531
1.06M
  (*avrule)->tgt = NULL;
2532
1.06M
  memset(&((*avrule)->perms), 0, sizeof((*avrule)->perms));
2533
1.06M
}
2534
2535
void cil_permissionx_init(struct cil_permissionx **permx)
2536
7.51k
{
2537
7.51k
  *permx = cil_malloc(sizeof(**permx));
2538
2539
7.51k
  cil_symtab_datum_init(&(*permx)->datum);
2540
7.51k
  (*permx)->kind = CIL_NONE;
2541
7.51k
  (*permx)->obj_str = NULL;
2542
7.51k
  (*permx)->obj = NULL;
2543
7.51k
  (*permx)->expr_str = NULL;
2544
7.51k
  (*permx)->perms = NULL;
2545
7.51k
}
2546
2547
void cil_deny_rule_init(struct cil_deny_rule **rule)
2548
38.5k
{
2549
38.5k
  *rule = cil_malloc(sizeof(**rule));
2550
2551
38.5k
  (*rule)->src_str = NULL;
2552
38.5k
  (*rule)->src = NULL;
2553
38.5k
  (*rule)->tgt_str = NULL;
2554
38.5k
  (*rule)->tgt = NULL;
2555
38.5k
  (*rule)->classperms = NULL;
2556
38.5k
}
2557
2558
void cil_type_rule_init(struct cil_type_rule **type_rule)
2559
28.2k
{
2560
28.2k
  *type_rule = cil_malloc(sizeof(**type_rule));
2561
2562
28.2k
  (*type_rule)->rule_kind = CIL_NONE;
2563
28.2k
  (*type_rule)->src_str = NULL;
2564
28.2k
  (*type_rule)->src = NULL;
2565
28.2k
  (*type_rule)->tgt_str = NULL;
2566
28.2k
  (*type_rule)->tgt = NULL;
2567
28.2k
  (*type_rule)->obj_str = NULL;
2568
28.2k
  (*type_rule)->obj = NULL;
2569
28.2k
  (*type_rule)->result_str = NULL;
2570
28.2k
  (*type_rule)->result = NULL;
2571
28.2k
}
2572
2573
void cil_roletransition_init(struct cil_roletransition **role_trans)
2574
15.8k
{
2575
15.8k
  *role_trans = cil_malloc(sizeof(**role_trans));
2576
2577
15.8k
  (*role_trans)->src_str = NULL;
2578
15.8k
  (*role_trans)->src = NULL;
2579
15.8k
  (*role_trans)->tgt_str = NULL;
2580
15.8k
  (*role_trans)->tgt = NULL;
2581
15.8k
  (*role_trans)->obj_str = NULL;
2582
15.8k
  (*role_trans)->obj = NULL;
2583
15.8k
  (*role_trans)->result_str = NULL;
2584
15.8k
  (*role_trans)->result = NULL;
2585
15.8k
}
2586
2587
void cil_roleallow_init(struct cil_roleallow **roleallow)
2588
6.54k
{
2589
6.54k
  *roleallow = cil_malloc(sizeof(**roleallow));
2590
2591
6.54k
  (*roleallow)->src_str = NULL;
2592
6.54k
  (*roleallow)->src = NULL;
2593
6.54k
  (*roleallow)->tgt_str = NULL;
2594
6.54k
  (*roleallow)->tgt = NULL;
2595
6.54k
}
2596
2597
void cil_catset_init(struct cil_catset **catset)
2598
5.20k
{
2599
5.20k
  *catset = cil_malloc(sizeof(**catset));
2600
2601
5.20k
  cil_symtab_datum_init(&(*catset)->datum);
2602
5.20k
  (*catset)->cats = NULL;
2603
5.20k
}
2604
2605
void cil_senscat_init(struct cil_senscat **senscat)
2606
9.44k
{
2607
9.44k
  *senscat = cil_malloc(sizeof(**senscat));
2608
2609
9.44k
  (*senscat)->sens_str = NULL;
2610
9.44k
  (*senscat)->sens = NULL;
2611
9.44k
  (*senscat)->cats = NULL;
2612
9.44k
}
2613
2614
void cil_cats_init(struct cil_cats **cats)
2615
1.13M
{
2616
1.13M
  *cats = cil_malloc(sizeof(**cats));
2617
2618
1.13M
  (*cats)->evaluated = CIL_FALSE;
2619
1.13M
  (*cats)->str_expr = NULL;
2620
1.13M
  (*cats)->datum_expr = NULL;
2621
1.13M
}
2622
2623
void cil_filecon_init(struct cil_filecon **filecon)
2624
50.2k
{
2625
50.2k
  *filecon = cil_malloc(sizeof(**filecon));
2626
2627
50.2k
  (*filecon)->path_str = NULL;
2628
50.2k
  (*filecon)->type = CIL_FILECON_ANY;
2629
50.2k
  (*filecon)->context_str = NULL;
2630
50.2k
  (*filecon)->context = NULL;
2631
50.2k
}
2632
2633
void cil_ibpkeycon_init(struct cil_ibpkeycon **ibpkeycon)
2634
970k
{
2635
970k
  *ibpkeycon = cil_malloc(sizeof(**ibpkeycon));
2636
2637
970k
  (*ibpkeycon)->subnet_prefix_str = NULL;
2638
970k
  (*ibpkeycon)->pkey_low = 0;
2639
970k
  (*ibpkeycon)->pkey_high = 0;
2640
970k
  (*ibpkeycon)->context_str = NULL;
2641
970k
  (*ibpkeycon)->context = NULL;
2642
970k
}
2643
2644
void cil_portcon_init(struct cil_portcon **portcon)
2645
1.01M
{
2646
1.01M
  *portcon = cil_malloc(sizeof(**portcon));
2647
1.01M
  (*portcon)->proto = 0;
2648
1.01M
  (*portcon)->port_low = 0;
2649
1.01M
  (*portcon)->port_high = 0;
2650
1.01M
  (*portcon)->context_str = NULL;
2651
1.01M
  (*portcon)->context = NULL;
2652
1.01M
}
2653
2654
void cil_nodecon_init(struct cil_nodecon **nodecon)
2655
18.6k
{
2656
18.6k
  *nodecon = cil_malloc(sizeof(**nodecon));
2657
2658
18.6k
  (*nodecon)->addr_str = NULL;
2659
18.6k
  (*nodecon)->addr = NULL;
2660
18.6k
  (*nodecon)->mask_str = NULL;
2661
18.6k
  (*nodecon)->mask = NULL;
2662
18.6k
  (*nodecon)->context_str = NULL;
2663
18.6k
  (*nodecon)->context = NULL;
2664
18.6k
}
2665
2666
void cil_genfscon_init(struct cil_genfscon **genfscon)
2667
12.5k
{
2668
12.5k
  *genfscon = cil_malloc(sizeof(**genfscon));
2669
2670
12.5k
  (*genfscon)->fs_str = NULL;
2671
12.5k
  (*genfscon)->path_str = NULL;
2672
12.5k
  (*genfscon)->file_type = CIL_FILECON_ANY;
2673
12.5k
  (*genfscon)->context_str = NULL;
2674
12.5k
  (*genfscon)->context = NULL;
2675
12.5k
}
2676
2677
void cil_pirqcon_init(struct cil_pirqcon **pirqcon)
2678
153k
{
2679
153k
  *pirqcon = cil_malloc(sizeof(**pirqcon));
2680
  
2681
153k
  (*pirqcon)->pirq = 0;
2682
153k
  (*pirqcon)->context_str = NULL;
2683
153k
  (*pirqcon)->context = NULL;
2684
153k
}
2685
2686
void cil_iomemcon_init(struct cil_iomemcon **iomemcon)
2687
13.3k
{
2688
13.3k
  *iomemcon = cil_malloc(sizeof(**iomemcon));
2689
2690
13.3k
  (*iomemcon)->iomem_low = 0;
2691
13.3k
  (*iomemcon)->iomem_high = 0;
2692
13.3k
  (*iomemcon)->context_str = NULL;
2693
13.3k
  (*iomemcon)->context = NULL;
2694
13.3k
}
2695
2696
void cil_ioportcon_init(struct cil_ioportcon **ioportcon)
2697
15.4k
{
2698
15.4k
  *ioportcon = cil_malloc(sizeof(**ioportcon));
2699
2700
15.4k
  (*ioportcon)->context_str = NULL;
2701
15.4k
  (*ioportcon)->context = NULL;
2702
15.4k
}
2703
2704
void cil_pcidevicecon_init(struct cil_pcidevicecon **pcidevicecon)
2705
12.3k
{
2706
12.3k
  *pcidevicecon = cil_malloc(sizeof(**pcidevicecon));
2707
2708
12.3k
  (*pcidevicecon)->dev = 0;
2709
12.3k
  (*pcidevicecon)->context_str = NULL;
2710
12.3k
  (*pcidevicecon)->context = NULL;
2711
12.3k
}
2712
2713
void cil_devicetreecon_init(struct cil_devicetreecon **dtcon)
2714
6.88k
{
2715
6.88k
  *dtcon = cil_malloc(sizeof(**dtcon));
2716
2717
6.88k
  (*dtcon)->path = NULL;
2718
6.88k
  (*dtcon)->context_str = NULL;
2719
6.88k
  (*dtcon)->context = NULL;
2720
6.88k
}
2721
2722
void cil_fsuse_init(struct cil_fsuse **fsuse)
2723
116k
{
2724
116k
  *fsuse = cil_malloc(sizeof(**fsuse));
2725
2726
116k
  (*fsuse)->type = 0;
2727
116k
  (*fsuse)->fs_str = NULL;
2728
116k
  (*fsuse)->context_str = NULL;
2729
116k
  (*fsuse)->context = NULL;
2730
116k
}
2731
2732
void cil_constrain_init(struct cil_constrain **constrain)
2733
67.5k
{
2734
67.5k
  *constrain = cil_malloc(sizeof(**constrain));
2735
2736
67.5k
  (*constrain)->classperms = NULL;
2737
67.5k
  (*constrain)->str_expr = NULL;
2738
67.5k
  (*constrain)->datum_expr = NULL;
2739
67.5k
}
2740
2741
void cil_validatetrans_init(struct cil_validatetrans **validtrans)
2742
43.4k
{
2743
43.4k
  *validtrans = cil_malloc(sizeof(**validtrans));
2744
2745
43.4k
  (*validtrans)->class_str = NULL;
2746
43.4k
  (*validtrans)->class = NULL;
2747
43.4k
  (*validtrans)->str_expr = NULL;
2748
43.4k
  (*validtrans)->datum_expr = NULL;
2749
43.4k
}
2750
2751
void cil_ipaddr_init(struct cil_ipaddr **ipaddr)
2752
24.6k
{
2753
24.6k
  *ipaddr = cil_malloc(sizeof(**ipaddr));
2754
2755
24.6k
  cil_symtab_datum_init(&(*ipaddr)->datum);
2756
24.6k
  memset(&(*ipaddr)->ip, 0, sizeof((*ipaddr)->ip));
2757
24.6k
}
2758
2759
void cil_perm_init(struct cil_perm **perm)
2760
134k
{
2761
134k
  *perm = cil_malloc(sizeof(**perm));
2762
2763
134k
  cil_symtab_datum_init(&(*perm)->datum);
2764
134k
  (*perm)->value = 0;
2765
134k
  (*perm)->classperms = NULL;
2766
134k
}
2767
2768
void cil_classpermission_init(struct cil_classpermission **cp)
2769
15.3k
{
2770
15.3k
  *cp = cil_malloc(sizeof(**cp));
2771
2772
15.3k
  cil_symtab_datum_init(&(*cp)->datum);
2773
15.3k
  (*cp)->classperms = NULL;
2774
15.3k
}
2775
2776
void cil_classpermissionset_init(struct cil_classpermissionset **cps)
2777
14.1k
{
2778
14.1k
  *cps = cil_malloc(sizeof(**cps));
2779
2780
14.1k
  (*cps)->set_str = NULL;
2781
14.1k
  (*cps)->set = NULL;
2782
14.1k
  (*cps)->classperms = NULL;
2783
14.1k
}
2784
2785
void cil_classperms_set_init(struct cil_classperms_set **cp_set)
2786
136k
{
2787
136k
  *cp_set = cil_malloc(sizeof(**cp_set));
2788
136k
  (*cp_set)->set_str = NULL;
2789
136k
  (*cp_set)->set = NULL;
2790
136k
}
2791
2792
void cil_classperms_init(struct cil_classperms **cp)
2793
1.35M
{
2794
1.35M
  *cp = cil_malloc(sizeof(**cp));
2795
1.35M
  (*cp)->class_str = NULL;
2796
1.35M
  (*cp)->class = NULL;
2797
1.35M
  (*cp)->perm_strs = NULL;
2798
1.35M
  (*cp)->perms = NULL;
2799
1.35M
}
2800
2801
void cil_classmapping_init(struct cil_classmapping **mapping)
2802
41.9k
{
2803
41.9k
  *mapping = cil_malloc(sizeof(**mapping));
2804
2805
41.9k
  (*mapping)->map_class_str = NULL;
2806
41.9k
  (*mapping)->map_class = NULL;
2807
41.9k
  (*mapping)->map_perm_str = NULL;
2808
41.9k
  (*mapping)->map_perm = NULL;
2809
41.9k
  (*mapping)->classperms = NULL;
2810
41.9k
}
2811
2812
void cil_user_init(struct cil_user **user)
2813
9.91k
{
2814
9.91k
  *user = cil_malloc(sizeof(**user));
2815
2816
9.91k
  cil_symtab_datum_init(&(*user)->datum);
2817
9.91k
  (*user)->bounds = NULL;
2818
9.91k
  (*user)->roles = NULL;
2819
9.91k
  (*user)->dftlevel = NULL;
2820
9.91k
  (*user)->range = NULL;
2821
9.91k
  (*user)->value = 0;
2822
9.91k
}
2823
2824
void cil_userattribute_init(struct cil_userattribute **attr)
2825
4.54k
{
2826
4.54k
  *attr = cil_malloc(sizeof(**attr));
2827
2828
4.54k
  cil_symtab_datum_init(&(*attr)->datum);
2829
2830
4.54k
  (*attr)->expr_list = NULL;
2831
4.54k
  (*attr)->users = NULL;
2832
4.54k
}
2833
2834
void cil_userattributeset_init(struct cil_userattributeset **attrset)
2835
8.68k
{
2836
8.68k
  *attrset = cil_malloc(sizeof(**attrset));
2837
2838
8.68k
  (*attrset)->attr_str = NULL;
2839
8.68k
  (*attrset)->attr = NULL;
2840
8.68k
  (*attrset)->str_expr = NULL;
2841
8.68k
  (*attrset)->datum_expr = NULL;
2842
8.68k
}
2843
2844
void cil_userlevel_init(struct cil_userlevel **usrlvl)
2845
31.0k
{
2846
31.0k
  *usrlvl = cil_malloc(sizeof(**usrlvl));
2847
2848
31.0k
  (*usrlvl)->user_str = NULL;
2849
31.0k
  (*usrlvl)->user = NULL;
2850
31.0k
  (*usrlvl)->level_str = NULL;
2851
31.0k
  (*usrlvl)->level = NULL;
2852
31.0k
}
2853
2854
void cil_userrange_init(struct cil_userrange **userrange)
2855
45.5k
{
2856
45.5k
  *userrange = cil_malloc(sizeof(**userrange));
2857
2858
45.5k
  (*userrange)->user_str = NULL;
2859
45.5k
  (*userrange)->user = NULL;
2860
45.5k
  (*userrange)->range_str = NULL;
2861
45.5k
  (*userrange)->range = NULL;
2862
45.5k
}
2863
2864
void cil_role_init(struct cil_role **role)
2865
17.1k
{
2866
17.1k
  *role = cil_malloc(sizeof(**role));
2867
2868
17.1k
  cil_symtab_datum_init(&(*role)->datum);
2869
17.1k
  (*role)->bounds = NULL;
2870
17.1k
  (*role)->types = NULL;
2871
17.1k
  (*role)->value = 0;
2872
17.1k
}
2873
2874
void cil_type_init(struct cil_type **type)
2875
439k
{
2876
439k
  *type = cil_malloc(sizeof(**type));
2877
2878
439k
  cil_symtab_datum_init(&(*type)->datum);
2879
439k
  (*type)->bounds = NULL;
2880
439k
  (*type)->value = 0;
2881
439k
}
2882
2883
void cil_cat_init(struct cil_cat **cat)
2884
8.00k
{
2885
8.00k
  *cat = cil_malloc(sizeof(**cat));
2886
2887
8.00k
  cil_symtab_datum_init(&(*cat)->datum);
2888
8.00k
  (*cat)->ordered = CIL_FALSE;
2889
8.00k
  (*cat)->value = 0;
2890
8.00k
}
2891
2892
void cil_args_init(struct cil_args **args)
2893
60.5k
{
2894
60.5k
  *args = cil_malloc(sizeof(**args));
2895
60.5k
  (*args)->arg_str = NULL;
2896
60.5k
  (*args)->arg = NULL;
2897
60.5k
  (*args)->param_str = NULL;
2898
60.5k
  (*args)->flavor = CIL_NONE;
2899
60.5k
}
2900
2901
void cil_call_init(struct cil_call **call)
2902
101k
{
2903
101k
  *call = cil_malloc(sizeof(**call));
2904
2905
101k
  (*call)->macro_str = NULL;
2906
101k
  (*call)->macro = NULL;
2907
101k
  (*call)->args_tree = NULL;
2908
101k
  (*call)->args = NULL;
2909
101k
  (*call)->copied = 0;
2910
101k
}
2911
2912
void cil_optional_init(struct cil_optional **optional)
2913
411k
{
2914
411k
  *optional = cil_malloc(sizeof(**optional));
2915
411k
  cil_symtab_datum_init(&(*optional)->datum);
2916
411k
}
2917
2918
void cil_param_init(struct cil_param **param)
2919
18.0k
{
2920
18.0k
  *param = cil_malloc(sizeof(**param));
2921
2922
18.0k
  (*param)->str = NULL;
2923
18.0k
  (*param)->flavor = CIL_NONE;
2924
18.0k
}
2925
2926
void cil_macro_init(struct cil_macro **macro)
2927
19.0k
{
2928
19.0k
  *macro = cil_malloc(sizeof(**macro));
2929
2930
19.0k
  cil_symtab_datum_init(&(*macro)->datum);
2931
19.0k
  cil_symtab_array_init((*macro)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_MACRO]);
2932
19.0k
  (*macro)->params = NULL;
2933
19.0k
}
2934
2935
void cil_policycap_init(struct cil_policycap **policycap)
2936
12.3k
{
2937
12.3k
  *policycap = cil_malloc(sizeof(**policycap));
2938
2939
12.3k
  cil_symtab_datum_init(&(*policycap)->datum);
2940
12.3k
}
2941
2942
void cil_bounds_init(struct cil_bounds **bounds)
2943
23.3k
{
2944
23.3k
  *bounds = cil_malloc(sizeof(**bounds));
2945
2946
23.3k
  (*bounds)->parent_str = NULL;
2947
23.3k
  (*bounds)->parent = NULL;
2948
23.3k
  (*bounds)->child_str = NULL;
2949
23.3k
  (*bounds)->child = NULL;
2950
23.3k
}
2951
2952
void cil_default_init(struct cil_default **def)
2953
29.2k
{
2954
29.2k
  *def = cil_malloc(sizeof(**def));
2955
2956
29.2k
  (*def)->flavor = CIL_NONE;
2957
29.2k
  (*def)->class_strs = NULL;
2958
29.2k
  (*def)->class_datums = NULL;
2959
29.2k
}
2960
2961
void cil_defaultrange_init(struct cil_defaultrange **def)
2962
16.9k
{
2963
16.9k
  *def = cil_malloc(sizeof(**def));
2964
2965
16.9k
  (*def)->class_strs = NULL;
2966
16.9k
  (*def)->class_datums = NULL;
2967
16.9k
}
2968
2969
void cil_handleunknown_init(struct cil_handleunknown **unk)
2970
906
{
2971
906
  *unk = cil_malloc(sizeof(**unk));
2972
906
}
2973
2974
void cil_mls_init(struct cil_mls **mls)
2975
3.30k
{
2976
3.30k
  *mls = cil_malloc(sizeof(**mls));
2977
3.30k
  (*mls)->value = 0;
2978
3.30k
}
2979
2980
void cil_src_info_init(struct cil_src_info **info)
2981
14.6k
{
2982
14.6k
  *info = cil_malloc(sizeof(**info));
2983
14.6k
  (*info)->kind = NULL;
2984
14.6k
  (*info)->hll_line = 0;
2985
14.6k
  (*info)->path = NULL;
2986
14.6k
}