Coverage Report

Created: 2025-09-17 06:24

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