Coverage Report

Created: 2026-02-14 07:06

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
13.9k
{
236
  /* Initialize CIL Keys into strpool */
237
13.9k
  CIL_KEY_CONS_T1 = cil_strpool_add("t1");
238
13.9k
  CIL_KEY_CONS_T2 = cil_strpool_add("t2");
239
13.9k
  CIL_KEY_CONS_T3 = cil_strpool_add("t3");
240
13.9k
  CIL_KEY_CONS_R1 = cil_strpool_add("r1");
241
13.9k
  CIL_KEY_CONS_R2 = cil_strpool_add("r2");
242
13.9k
  CIL_KEY_CONS_R3 = cil_strpool_add("r3");
243
13.9k
  CIL_KEY_CONS_U1 = cil_strpool_add("u1");
244
13.9k
  CIL_KEY_CONS_U2 = cil_strpool_add("u2");
245
13.9k
  CIL_KEY_CONS_U3 = cil_strpool_add("u3");
246
13.9k
  CIL_KEY_CONS_L1 = cil_strpool_add("l1");
247
13.9k
  CIL_KEY_CONS_L2 = cil_strpool_add("l2");
248
13.9k
  CIL_KEY_CONS_H1 = cil_strpool_add("h1");
249
13.9k
  CIL_KEY_CONS_H2 = cil_strpool_add("h2");
250
13.9k
  CIL_KEY_AND = cil_strpool_add("and");
251
13.9k
  CIL_KEY_OR = cil_strpool_add("or");
252
13.9k
  CIL_KEY_NOT = cil_strpool_add("not");
253
13.9k
  CIL_KEY_EQ = cil_strpool_add("eq");
254
13.9k
  CIL_KEY_NEQ = cil_strpool_add("neq");
255
13.9k
  CIL_KEY_CONS_DOM = cil_strpool_add("dom");
256
13.9k
  CIL_KEY_CONS_DOMBY = cil_strpool_add("domby");
257
13.9k
  CIL_KEY_CONS_INCOMP = cil_strpool_add("incomp");
258
13.9k
  CIL_KEY_CONDTRUE = cil_strpool_add("true");
259
13.9k
  CIL_KEY_CONDFALSE = cil_strpool_add("false");
260
13.9k
  CIL_KEY_SELF = cil_strpool_add("self");
261
13.9k
  CIL_KEY_NOTSELF = cil_strpool_add("notself");
262
13.9k
  CIL_KEY_OTHER = cil_strpool_add("other");
263
13.9k
  CIL_KEY_OBJECT_R = cil_strpool_add("object_r");
264
13.9k
  CIL_KEY_STAR = cil_strpool_add("*");
265
13.9k
  CIL_KEY_UDP = cil_strpool_add("udp");
266
13.9k
  CIL_KEY_TCP = cil_strpool_add("tcp");
267
13.9k
  CIL_KEY_DCCP = cil_strpool_add("dccp");
268
13.9k
  CIL_KEY_SCTP = cil_strpool_add("sctp");
269
13.9k
  CIL_KEY_AUDITALLOW = cil_strpool_add("auditallow");
270
13.9k
  CIL_KEY_TUNABLEIF = cil_strpool_add("tunableif");
271
13.9k
  CIL_KEY_ALLOW = cil_strpool_add("allow");
272
13.9k
  CIL_KEY_DONTAUDIT = cil_strpool_add("dontaudit");
273
13.9k
  CIL_KEY_TYPETRANSITION = cil_strpool_add("typetransition");
274
13.9k
  CIL_KEY_TYPECHANGE = cil_strpool_add("typechange");
275
13.9k
  CIL_KEY_CALL = cil_strpool_add("call");
276
13.9k
  CIL_KEY_TUNABLE = cil_strpool_add("tunable");
277
13.9k
  CIL_KEY_XOR = cil_strpool_add("xor");
278
13.9k
  CIL_KEY_ALL = cil_strpool_add("all");
279
13.9k
  CIL_KEY_RANGE = cil_strpool_add("range");
280
13.9k
  CIL_KEY_TYPE = cil_strpool_add("type");
281
13.9k
  CIL_KEY_ROLE = cil_strpool_add("role");
282
13.9k
  CIL_KEY_USER = cil_strpool_add("user");
283
13.9k
  CIL_KEY_USERATTRIBUTE = cil_strpool_add("userattribute");
284
13.9k
  CIL_KEY_USERATTRIBUTESET = cil_strpool_add("userattributeset");
285
13.9k
  CIL_KEY_SENSITIVITY = cil_strpool_add("sensitivity");
286
13.9k
  CIL_KEY_CATEGORY = cil_strpool_add("category");
287
13.9k
  CIL_KEY_CATSET = cil_strpool_add("categoryset");
288
13.9k
  CIL_KEY_LEVEL = cil_strpool_add("level");
289
13.9k
  CIL_KEY_LEVELRANGE = cil_strpool_add("levelrange");
290
13.9k
  CIL_KEY_CLASS = cil_strpool_add("class");
291
13.9k
  CIL_KEY_IPADDR = cil_strpool_add("ipaddr");
292
13.9k
  CIL_KEY_MAP_CLASS = cil_strpool_add("classmap");
293
13.9k
  CIL_KEY_CLASSPERMISSION = cil_strpool_add("classpermission");
294
13.9k
  CIL_KEY_BOOL = cil_strpool_add("boolean");
295
13.9k
  CIL_KEY_STRING = cil_strpool_add("string");
296
13.9k
  CIL_KEY_NAME = cil_strpool_add("name");
297
13.9k
  CIL_KEY_HANDLEUNKNOWN = cil_strpool_add("handleunknown");
298
13.9k
  CIL_KEY_HANDLEUNKNOWN_ALLOW = cil_strpool_add("allow");
299
13.9k
  CIL_KEY_HANDLEUNKNOWN_DENY = cil_strpool_add("deny");
300
13.9k
  CIL_KEY_HANDLEUNKNOWN_REJECT = cil_strpool_add("reject");
301
13.9k
  CIL_KEY_BLOCKINHERIT = cil_strpool_add("blockinherit");
302
13.9k
  CIL_KEY_BLOCKABSTRACT = cil_strpool_add("blockabstract");
303
13.9k
  CIL_KEY_CLASSORDER = cil_strpool_add("classorder");
304
13.9k
  CIL_KEY_CLASSMAPPING = cil_strpool_add("classmapping");
305
13.9k
  CIL_KEY_CLASSPERMISSIONSET = cil_strpool_add("classpermissionset");
306
13.9k
  CIL_KEY_COMMON = cil_strpool_add("common");
307
13.9k
  CIL_KEY_CLASSCOMMON = cil_strpool_add("classcommon");
308
13.9k
  CIL_KEY_SID = cil_strpool_add("sid");
309
13.9k
  CIL_KEY_SIDCONTEXT = cil_strpool_add("sidcontext");
310
13.9k
  CIL_KEY_SIDORDER = cil_strpool_add("sidorder");
311
13.9k
  CIL_KEY_USERLEVEL = cil_strpool_add("userlevel");
312
13.9k
  CIL_KEY_USERRANGE = cil_strpool_add("userrange");
313
13.9k
  CIL_KEY_USERBOUNDS = cil_strpool_add("userbounds");
314
13.9k
  CIL_KEY_USERPREFIX = cil_strpool_add("userprefix");
315
13.9k
  CIL_KEY_SELINUXUSER = cil_strpool_add("selinuxuser");
316
13.9k
  CIL_KEY_SELINUXUSERDEFAULT = cil_strpool_add("selinuxuserdefault");
317
13.9k
  CIL_KEY_TYPEATTRIBUTE = cil_strpool_add("typeattribute");
318
13.9k
  CIL_KEY_TYPEATTRIBUTESET = cil_strpool_add("typeattributeset");
319
13.9k
  CIL_KEY_EXPANDTYPEATTRIBUTE = cil_strpool_add("expandtypeattribute");
320
13.9k
  CIL_KEY_TYPEALIAS = cil_strpool_add("typealias");
321
13.9k
  CIL_KEY_TYPEALIASACTUAL = cil_strpool_add("typealiasactual");
322
13.9k
  CIL_KEY_TYPEBOUNDS = cil_strpool_add("typebounds");
323
13.9k
  CIL_KEY_TYPEPERMISSIVE = cil_strpool_add("typepermissive");
324
13.9k
  CIL_KEY_TYPENEVERAUDIT = cil_strpool_add("typeneveraudit");
325
13.9k
  CIL_KEY_RANGETRANSITION = cil_strpool_add("rangetransition");
326
13.9k
  CIL_KEY_USERROLE = cil_strpool_add("userrole");
327
13.9k
  CIL_KEY_ROLETYPE = cil_strpool_add("roletype");
328
13.9k
  CIL_KEY_ROLETRANSITION = cil_strpool_add("roletransition");
329
13.9k
  CIL_KEY_ROLEALLOW = cil_strpool_add("roleallow");
330
13.9k
  CIL_KEY_ROLEATTRIBUTE = cil_strpool_add("roleattribute");
331
13.9k
  CIL_KEY_ROLEATTRIBUTESET = cil_strpool_add("roleattributeset");
332
13.9k
  CIL_KEY_ROLEBOUNDS = cil_strpool_add("rolebounds");
333
13.9k
  CIL_KEY_BOOLEANIF = cil_strpool_add("booleanif");
334
13.9k
  CIL_KEY_NEVERALLOW = cil_strpool_add("neverallow");
335
13.9k
  CIL_KEY_TYPEMEMBER = cil_strpool_add("typemember");
336
13.9k
  CIL_KEY_SENSALIAS = cil_strpool_add("sensitivityalias");
337
13.9k
  CIL_KEY_SENSALIASACTUAL = cil_strpool_add("sensitivityaliasactual");
338
13.9k
  CIL_KEY_CATALIAS = cil_strpool_add("categoryalias");
339
13.9k
  CIL_KEY_CATALIASACTUAL = cil_strpool_add("categoryaliasactual");
340
13.9k
  CIL_KEY_CATORDER = cil_strpool_add("categoryorder");
341
13.9k
  CIL_KEY_SENSITIVITYORDER = cil_strpool_add("sensitivityorder");
342
13.9k
  CIL_KEY_SENSCAT = cil_strpool_add("sensitivitycategory");
343
13.9k
  CIL_KEY_CONSTRAIN = cil_strpool_add("constrain");
344
13.9k
  CIL_KEY_MLSCONSTRAIN = cil_strpool_add("mlsconstrain");
345
13.9k
  CIL_KEY_VALIDATETRANS = cil_strpool_add("validatetrans");
346
13.9k
  CIL_KEY_MLSVALIDATETRANS = cil_strpool_add("mlsvalidatetrans");
347
13.9k
  CIL_KEY_CONTEXT = cil_strpool_add("context");
348
13.9k
  CIL_KEY_FILECON = cil_strpool_add("filecon");
349
13.9k
  CIL_KEY_IBPKEYCON = cil_strpool_add("ibpkeycon");
350
13.9k
  CIL_KEY_IBENDPORTCON = cil_strpool_add("ibendportcon");
351
13.9k
  CIL_KEY_PORTCON = cil_strpool_add("portcon");
352
13.9k
  CIL_KEY_NODECON = cil_strpool_add("nodecon");
353
13.9k
  CIL_KEY_GENFSCON = cil_strpool_add("genfscon");
354
13.9k
  CIL_KEY_NETIFCON = cil_strpool_add("netifcon");
355
13.9k
  CIL_KEY_PIRQCON = cil_strpool_add("pirqcon");
356
13.9k
  CIL_KEY_IOMEMCON = cil_strpool_add("iomemcon");
357
13.9k
  CIL_KEY_IOPORTCON = cil_strpool_add("ioportcon");
358
13.9k
  CIL_KEY_PCIDEVICECON = cil_strpool_add("pcidevicecon");
359
13.9k
  CIL_KEY_DEVICETREECON = cil_strpool_add("devicetreecon");
360
13.9k
  CIL_KEY_FSUSE = cil_strpool_add("fsuse");
361
13.9k
  CIL_KEY_POLICYCAP = cil_strpool_add("policycap");
362
13.9k
  CIL_KEY_OPTIONAL = cil_strpool_add("optional");
363
13.9k
  CIL_KEY_DEFAULTUSER = cil_strpool_add("defaultuser");
364
13.9k
  CIL_KEY_DEFAULTROLE = cil_strpool_add("defaultrole");
365
13.9k
  CIL_KEY_DEFAULTTYPE = cil_strpool_add("defaulttype");
366
13.9k
  CIL_KEY_MACRO = cil_strpool_add("macro");
367
13.9k
  CIL_KEY_IN = cil_strpool_add("in");
368
13.9k
  CIL_KEY_IN_BEFORE = cil_strpool_add("before");
369
13.9k
  CIL_KEY_IN_AFTER = cil_strpool_add("after");
370
13.9k
  CIL_KEY_MLS = cil_strpool_add("mls");
371
13.9k
  CIL_KEY_DEFAULTRANGE = cil_strpool_add("defaultrange");
372
13.9k
  CIL_KEY_GLOB = cil_strpool_add("*");
373
13.9k
  CIL_KEY_FILE = cil_strpool_add("file");
374
13.9k
  CIL_KEY_DIR = cil_strpool_add("dir");
375
13.9k
  CIL_KEY_CHAR = cil_strpool_add("char");
376
13.9k
  CIL_KEY_BLOCK = cil_strpool_add("block");
377
13.9k
  CIL_KEY_SOCKET = cil_strpool_add("socket");
378
13.9k
  CIL_KEY_PIPE = cil_strpool_add("pipe");
379
13.9k
  CIL_KEY_SYMLINK = cil_strpool_add("symlink");
380
13.9k
  CIL_KEY_ANY = cil_strpool_add("any");
381
13.9k
  CIL_KEY_XATTR = cil_strpool_add("xattr");
382
13.9k
  CIL_KEY_TASK = cil_strpool_add("task");
383
13.9k
  CIL_KEY_TRANS = cil_strpool_add("trans");
384
13.9k
  CIL_KEY_SOURCE = cil_strpool_add("source");
385
13.9k
  CIL_KEY_TARGET = cil_strpool_add("target");
386
13.9k
  CIL_KEY_LOW = cil_strpool_add("low");
387
13.9k
  CIL_KEY_HIGH = cil_strpool_add("high");
388
13.9k
  CIL_KEY_LOW_HIGH = cil_strpool_add("low-high");
389
13.9k
  CIL_KEY_GLBLUB = cil_strpool_add("glblub");
390
13.9k
  CIL_KEY_ROOT = cil_strpool_add("<root>");
391
13.9k
  CIL_KEY_NODE = cil_strpool_add("<node>");
392
13.9k
  CIL_KEY_PERM = cil_strpool_add("perm");
393
13.9k
  CIL_KEY_ALLOWX = cil_strpool_add("allowx");
394
13.9k
  CIL_KEY_AUDITALLOWX = cil_strpool_add("auditallowx");
395
13.9k
  CIL_KEY_DONTAUDITX = cil_strpool_add("dontauditx");
396
13.9k
  CIL_KEY_NEVERALLOWX = cil_strpool_add("neverallowx");
397
13.9k
  CIL_KEY_PERMISSIONX = cil_strpool_add("permissionx");
398
13.9k
  CIL_KEY_IOCTL = cil_strpool_add("ioctl");
399
13.9k
  CIL_KEY_NLMSG = cil_strpool_add("nlmsg");
400
13.9k
  CIL_KEY_UNORDERED = cil_strpool_add("unordered");
401
13.9k
  CIL_KEY_SRC_INFO = cil_strpool_add("<src_info>");
402
13.9k
  CIL_KEY_SRC_CIL = cil_strpool_add("cil");
403
13.9k
  CIL_KEY_SRC_HLL_LMS = cil_strpool_add("lms");
404
13.9k
  CIL_KEY_SRC_HLL_LMX = cil_strpool_add("lmx");
405
13.9k
  CIL_KEY_SRC_HLL_LME = cil_strpool_add("lme");
406
13.9k
  CIL_KEY_DENY_RULE = cil_strpool_add("deny");
407
13.9k
}
408
409
void cil_db_init(struct cil_db **db)
410
13.9k
{
411
13.9k
  *db = cil_malloc(sizeof(**db));
412
413
13.9k
  cil_strpool_init();
414
13.9k
  cil_init_keys();
415
416
13.9k
  cil_tree_init(&(*db)->parse);
417
13.9k
  cil_tree_init(&(*db)->ast);
418
13.9k
  cil_root_init((struct cil_root **)&(*db)->ast->root->data);
419
13.9k
  (*db)->sidorder = NULL;
420
13.9k
  (*db)->classorder = NULL;
421
13.9k
  (*db)->catorder = NULL;
422
13.9k
  (*db)->sensitivityorder = NULL;
423
13.9k
  cil_sort_init(&(*db)->netifcon);
424
13.9k
  cil_sort_init(&(*db)->genfscon);
425
13.9k
  cil_sort_init(&(*db)->filecon);
426
13.9k
  cil_sort_init(&(*db)->nodecon);
427
13.9k
  cil_sort_init(&(*db)->ibpkeycon);
428
13.9k
  cil_sort_init(&(*db)->ibendportcon);
429
13.9k
  cil_sort_init(&(*db)->portcon);
430
13.9k
  cil_sort_init(&(*db)->pirqcon);
431
13.9k
  cil_sort_init(&(*db)->iomemcon);
432
13.9k
  cil_sort_init(&(*db)->ioportcon);
433
13.9k
  cil_sort_init(&(*db)->pcidevicecon);
434
13.9k
  cil_sort_init(&(*db)->devicetreecon);
435
13.9k
  cil_sort_init(&(*db)->fsuse);
436
13.9k
  cil_list_init(&(*db)->userprefixes, CIL_LIST_ITEM);
437
13.9k
  cil_list_init(&(*db)->selinuxusers, CIL_LIST_ITEM);
438
13.9k
  cil_list_init(&(*db)->declared_strings, CIL_LIST_ITEM);
439
440
13.9k
  cil_type_init(&(*db)->selftype);
441
13.9k
  (*db)->selftype->datum.name = CIL_KEY_SELF;
442
13.9k
  (*db)->selftype->datum.fqn = CIL_KEY_SELF;
443
13.9k
  cil_type_init(&(*db)->notselftype);
444
13.9k
  (*db)->notselftype->datum.name = CIL_KEY_NOTSELF;
445
13.9k
  (*db)->notselftype->datum.fqn = CIL_KEY_NOTSELF;
446
13.9k
  cil_type_init(&(*db)->othertype);
447
13.9k
  (*db)->othertype->datum.name = CIL_KEY_OTHER;
448
13.9k
  (*db)->othertype->datum.fqn = CIL_KEY_OTHER;
449
13.9k
  (*db)->num_types_and_attrs = 0;
450
13.9k
  (*db)->num_classes = 0;
451
13.9k
  (*db)->num_types = 0;
452
13.9k
  (*db)->num_roles = 0;
453
13.9k
  (*db)->num_users = 0;
454
13.9k
  (*db)->num_cats = 0;
455
13.9k
  (*db)->val_to_type = NULL;
456
13.9k
  (*db)->val_to_role = NULL;
457
13.9k
  (*db)->val_to_user = NULL;
458
459
13.9k
  (*db)->disable_dontaudit = CIL_FALSE;
460
13.9k
  (*db)->disable_neverallow = CIL_FALSE;
461
13.9k
  (*db)->attrs_expand_generated = CIL_FALSE;
462
13.9k
  (*db)->attrs_expand_size = 1;
463
13.9k
  (*db)->preserve_tunables = CIL_FALSE;
464
13.9k
  (*db)->handle_unknown = -1;
465
13.9k
  (*db)->mls = -1;
466
13.9k
  (*db)->multiple_decls = CIL_FALSE;
467
13.9k
  (*db)->qualified_names = CIL_FALSE;
468
13.9k
  (*db)->target_platform = SEPOL_TARGET_SELINUX;
469
13.9k
  (*db)->policy_version = POLICYDB_VERSION_MAX;
470
13.9k
}
471
472
static void cil_declared_strings_list_destroy(struct cil_list **strings)
473
13.9k
{
474
13.9k
  struct cil_list_item *i;
475
476
13.9k
  cil_list_for_each(i, *strings) {
477
6.95k
    struct cil_symtab_datum *d = i->data;
478
6.95k
    cil_symtab_datum_destroy(d);
479
6.95k
    free(d);
480
6.95k
  }
481
13.9k
  cil_list_destroy(strings, CIL_FALSE);
482
13.9k
}
483
484
void cil_db_destroy(struct cil_db **db)
485
13.9k
{
486
13.9k
  if (db == NULL || *db == NULL) {
487
0
    return;
488
0
  }
489
490
13.9k
  cil_tree_destroy(&(*db)->parse);
491
13.9k
  cil_tree_destroy(&(*db)->ast);
492
13.9k
  cil_list_destroy(&(*db)->sidorder, CIL_FALSE);
493
13.9k
  cil_list_destroy(&(*db)->classorder, CIL_FALSE);
494
13.9k
  cil_list_destroy(&(*db)->catorder, CIL_FALSE);
495
13.9k
  cil_list_destroy(&(*db)->sensitivityorder, CIL_FALSE);
496
13.9k
  cil_sort_destroy(&(*db)->netifcon);
497
13.9k
  cil_sort_destroy(&(*db)->genfscon);
498
13.9k
  cil_sort_destroy(&(*db)->filecon);
499
13.9k
  cil_sort_destroy(&(*db)->nodecon);
500
13.9k
  cil_sort_destroy(&(*db)->ibpkeycon);
501
13.9k
  cil_sort_destroy(&(*db)->ibendportcon);
502
13.9k
  cil_sort_destroy(&(*db)->portcon);
503
13.9k
  cil_sort_destroy(&(*db)->pirqcon);
504
13.9k
  cil_sort_destroy(&(*db)->iomemcon);
505
13.9k
  cil_sort_destroy(&(*db)->ioportcon);
506
13.9k
  cil_sort_destroy(&(*db)->pcidevicecon);
507
13.9k
  cil_sort_destroy(&(*db)->devicetreecon);
508
13.9k
  cil_sort_destroy(&(*db)->fsuse);
509
13.9k
  cil_list_destroy(&(*db)->userprefixes, CIL_FALSE);
510
13.9k
  cil_list_destroy(&(*db)->selinuxusers, CIL_FALSE);
511
512
13.9k
  cil_declared_strings_list_destroy(&(*db)->declared_strings);
513
514
13.9k
  cil_destroy_type((*db)->selftype);
515
13.9k
  cil_destroy_type((*db)->notselftype);
516
13.9k
  cil_destroy_type((*db)->othertype);
517
518
13.9k
  cil_strpool_destroy();
519
13.9k
  free((*db)->val_to_type);
520
13.9k
  free((*db)->val_to_role);
521
13.9k
  free((*db)->val_to_user);
522
523
13.9k
  free(*db);
524
13.9k
  *db = NULL; 
525
13.9k
}
526
527
void cil_root_init(struct cil_root **root)
528
13.9k
{
529
13.9k
  struct cil_root *r = cil_malloc(sizeof(*r));
530
13.9k
  cil_symtab_array_init(r->symtab, cil_sym_sizes[CIL_SYM_ARRAY_ROOT]);
531
532
13.9k
  *root = r;
533
13.9k
}
534
535
void cil_root_destroy(struct cil_root *root)
536
13.9k
{
537
13.9k
  if (root == NULL) {
538
0
    return;
539
0
  }
540
13.9k
  cil_symtab_array_destroy(root->symtab);
541
13.9k
  free(root);
542
13.9k
}
543
544
int cil_add_file(cil_db_t *db, const char *name, const char *data, size_t size)
545
13.9k
{
546
13.9k
  char *buffer = NULL;
547
13.9k
  int rc;
548
549
13.9k
  cil_log(CIL_INFO, "Parsing %s\n", name);
550
551
13.9k
  buffer = cil_malloc(size + 2);
552
13.9k
  memcpy(buffer, data, size);
553
13.9k
  memset(buffer + size, 0, 2);
554
555
13.9k
  rc = cil_parser(name, buffer, size + 2, &db->parse);
556
13.9k
  if (rc != SEPOL_OK) {
557
418
    cil_log(CIL_INFO, "Failed to parse %s\n", name);
558
418
    goto exit;
559
418
  }
560
561
13.5k
  free(buffer);
562
13.5k
  buffer = NULL;
563
564
13.5k
  rc = SEPOL_OK;
565
566
13.9k
exit:
567
13.9k
  free(buffer);
568
569
13.9k
  return rc;
570
13.5k
}
571
572
int cil_compile(struct cil_db *db)
573
13.5k
{
574
13.5k
  int rc = SEPOL_ERR;
575
576
13.5k
  if (db == NULL) {
577
0
    goto exit;
578
0
  }
579
580
13.5k
  cil_log(CIL_INFO, "Building AST from Parse Tree\n");
581
13.5k
  rc = cil_build_ast(db, db->parse->root, db->ast->root);
582
13.5k
  if (rc != SEPOL_OK) {
583
1.52k
    cil_log(CIL_ERR, "Failed to build AST\n");
584
1.52k
    goto exit;
585
1.52k
  }
586
587
11.9k
  cil_log(CIL_INFO, "Destroying Parse Tree\n");
588
11.9k
  cil_tree_destroy(&db->parse);
589
590
11.9k
  cil_log(CIL_INFO, "Resolving AST\n");
591
11.9k
  rc = cil_resolve_ast(db, db->ast->root);
592
11.9k
  if (rc != SEPOL_OK) {
593
5.25k
    cil_log(CIL_ERR, "Failed to resolve AST\n");
594
5.25k
    goto exit;
595
5.25k
  }
596
597
6.73k
  cil_log(CIL_INFO, "Qualifying Names\n");
598
6.73k
  rc = cil_fqn_qualify(db->ast->root);
599
6.73k
  if (rc != SEPOL_OK) {
600
10
    cil_log(CIL_ERR, "Failed to qualify names\n");
601
10
    goto exit;
602
10
  }
603
604
6.72k
  cil_log(CIL_INFO, "Compile post process\n");
605
6.72k
  rc = cil_post_process(db);
606
6.72k
  if (rc != SEPOL_OK ) {
607
3.62k
    cil_log(CIL_ERR, "Post process failed\n");
608
3.62k
    goto exit;
609
3.62k
  }
610
611
13.5k
exit:
612
613
13.5k
  return rc;
614
6.72k
}
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.09k
{
759
3.09k
  int rc;
760
761
3.09k
  cil_log(CIL_INFO, "Building policy binary\n");
762
3.09k
  rc = cil_binary_create(db, sepol_db);
763
3.09k
  if (rc != SEPOL_OK) {
764
860
    cil_log(CIL_ERR, "Failed to generate binary\n");
765
860
    goto exit;
766
860
  }
767
768
3.09k
exit:
769
3.09k
  return rc;
770
3.09k
}
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
12.6M
{
780
12.6M
  if (*data == NULL) {
781
1.27M
    return;
782
1.27M
  }
783
784
11.3M
  switch(flavor) {
785
0
  case CIL_NONE:
786
0
    break;
787
13.9k
  case CIL_ROOT:
788
13.9k
    cil_root_destroy(*data);
789
13.9k
    break;
790
2.32M
  case CIL_NODE:
791
2.32M
    break;
792
2.41M
  case CIL_STRING:
793
2.41M
    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
18.0k
  case CIL_PARAM:
802
18.0k
    cil_destroy_param(*data);
803
18.0k
    break;
804
60.7k
  case CIL_ARGS:
805
60.7k
    cil_destroy_args(*data);
806
60.7k
    break;
807
447k
  case CIL_BLOCK:
808
447k
    cil_destroy_block(*data);
809
447k
    break;
810
190k
  case CIL_BLOCKINHERIT:
811
190k
    cil_destroy_blockinherit(*data);
812
190k
    break;
813
1.39k
  case CIL_BLOCKABSTRACT:
814
1.39k
    cil_destroy_blockabstract(*data);
815
1.39k
    break;
816
17.2k
  case CIL_IN:
817
17.2k
    cil_destroy_in(*data);
818
17.2k
    break;
819
21.7k
  case CIL_MACRO:
820
21.7k
    cil_destroy_macro(*data);
821
21.7k
    break;
822
108k
  case CIL_CALL:
823
108k
    cil_destroy_call(*data);
824
108k
    break;
825
50.3k
  case CIL_OPTIONAL:
826
50.3k
    cil_destroy_optional(*data);
827
50.3k
    break;
828
26.6k
  case CIL_BOOL:
829
26.6k
    cil_destroy_bool(*data);
830
26.6k
    break;
831
207k
  case CIL_BOOLEANIF:
832
207k
    cil_destroy_boolif(*data);
833
207k
    break;
834
2.19k
  case CIL_TUNABLE:
835
2.19k
    cil_destroy_tunable(*data);
836
2.19k
    break;
837
13.2k
  case CIL_TUNABLEIF:
838
13.2k
    cil_destroy_tunif(*data);
839
13.2k
    break;
840
224k
  case CIL_CONDBLOCK:
841
224k
    cil_destroy_condblock(*data);
842
224k
    break;
843
0
  case CIL_CONDTRUE:
844
0
    break;
845
0
  case CIL_CONDFALSE:
846
0
    break;
847
108k
  case CIL_PERM:
848
114k
  case CIL_MAP_PERM:
849
114k
    cil_destroy_perm(*data);
850
114k
    break;
851
2.28k
  case CIL_COMMON:
852
33.3k
  case CIL_CLASS:
853
38.7k
  case CIL_MAP_CLASS:
854
38.7k
    cil_destroy_class(*data);
855
38.7k
    break;
856
34.1k
  case CIL_CLASSORDER:
857
34.1k
    cil_destroy_ordered(*data);
858
34.1k
    break;
859
4.77k
  case CIL_CLASSPERMISSION:
860
4.77k
    cil_destroy_classpermission(*data);
861
4.77k
    break;
862
5.63k
  case CIL_CLASSCOMMON:
863
5.63k
    cil_destroy_classcommon(*data);
864
5.63k
    break;
865
40.0k
  case CIL_CLASSMAPPING:
866
40.0k
    cil_destroy_classmapping(*data);
867
40.0k
    break;
868
6.61k
  case CIL_CLASSPERMS:
869
6.61k
    cil_destroy_classperms(*data);
870
6.61k
    break;
871
0
  case CIL_CLASSPERMS_SET:
872
0
    cil_destroy_classperms_set(*data);
873
0
    break;
874
7.09k
  case CIL_CLASSPERMISSIONSET:
875
7.09k
    cil_destroy_classpermissionset(*data);
876
7.09k
    break;
877
18.7k
  case CIL_USER:
878
18.7k
    cil_destroy_user(*data);
879
18.7k
    break;
880
23.9k
  case CIL_USERATTRIBUTE:
881
23.9k
    cil_destroy_userattribute(*data);
882
23.9k
    break;
883
24.5k
  case CIL_USERATTRIBUTESET:
884
24.5k
    cil_destroy_userattributeset(*data);
885
24.5k
    break;
886
1.68k
  case CIL_USERPREFIX:
887
1.68k
    cil_destroy_userprefix(*data);
888
1.68k
    break;
889
23.0k
  case CIL_USERROLE:
890
23.0k
    cil_destroy_userrole(*data);
891
23.0k
    break;
892
25.2k
  case CIL_USERLEVEL:
893
25.2k
    cil_destroy_userlevel(*data);
894
25.2k
    break;
895
42.0k
  case CIL_USERRANGE:
896
42.0k
    cil_destroy_userrange(*data);
897
42.0k
    break;
898
2.54k
  case CIL_USERBOUNDS:
899
2.54k
    cil_destroy_bounds(*data);
900
2.54k
    break;
901
1.66k
  case CIL_SELINUXUSER:
902
3.38k
  case CIL_SELINUXUSERDEFAULT:
903
3.38k
    cil_destroy_selinuxuser(*data);
904
3.38k
    break;
905
42.3k
  case CIL_ROLE:
906
42.3k
    cil_destroy_role(*data);
907
42.3k
    break;
908
8.42k
  case CIL_ROLEATTRIBUTE:
909
8.42k
    cil_destroy_roleattribute(*data);
910
8.42k
    break;
911
10.0k
  case CIL_ROLEATTRIBUTESET:
912
10.0k
    cil_destroy_roleattributeset(*data);
913
10.0k
    break;
914
133k
  case CIL_ROLETYPE:
915
133k
    cil_destroy_roletype(*data);
916
133k
    break;
917
1.33k
  case CIL_ROLEBOUNDS:
918
1.33k
    cil_destroy_bounds(*data);
919
1.33k
    break;
920
598k
  case CIL_TYPE:
921
598k
    cil_destroy_type(*data);
922
598k
    break;
923
143k
  case CIL_TYPEATTRIBUTE:
924
143k
    cil_destroy_typeattribute(*data);
925
143k
    break;
926
1.81k
  case CIL_TYPEALIAS:
927
1.81k
    cil_destroy_alias(*data);
928
1.81k
    break;
929
141k
  case CIL_TYPEATTRIBUTESET:
930
141k
    cil_destroy_typeattributeset(*data);
931
141k
    break;
932
4.63k
  case CIL_EXPANDTYPEATTRIBUTE:
933
4.63k
    cil_destroy_expandtypeattribute(*data);
934
4.63k
    break;
935
2.04k
  case CIL_TYPEALIASACTUAL:
936
2.04k
    cil_destroy_aliasactual(*data);
937
2.04k
    break;
938
17.5k
  case CIL_TYPEBOUNDS:
939
17.5k
    cil_destroy_bounds(*data);
940
17.5k
    break;
941
2.48k
  case CIL_TYPEPERMISSIVE:
942
2.48k
    cil_destroy_typepermissive(*data);
943
2.48k
    break;
944
1.29k
  case CIL_TYPENEVERAUDIT:
945
1.29k
    cil_destroy_typeneveraudit(*data);
946
1.29k
    break;
947
7.28k
  case CIL_SENS:
948
7.28k
    cil_destroy_sensitivity(*data);
949
7.28k
    break;
950
2.42k
  case CIL_SENSALIAS:
951
2.42k
    cil_destroy_alias(*data);
952
2.42k
    break;
953
2.84k
  case CIL_SENSALIASACTUAL:
954
2.84k
    cil_destroy_aliasactual(*data);
955
2.84k
    break;
956
5.46k
  case CIL_SENSITIVITYORDER:
957
5.46k
    cil_destroy_ordered(*data);
958
5.46k
    break;
959
16.4k
  case CIL_SENSCAT:
960
16.4k
    cil_destroy_senscat(*data);
961
16.4k
    break;
962
8.63k
  case CIL_CAT:
963
8.63k
    cil_destroy_category(*data);
964
8.63k
    break;
965
7.34k
  case CIL_CATSET:
966
7.34k
    cil_destroy_catset(*data);
967
7.34k
    break;
968
3.03k
  case CIL_CATALIAS:
969
3.03k
    cil_destroy_alias(*data);
970
3.03k
    break;
971
3.65k
  case CIL_CATALIASACTUAL:
972
3.65k
    cil_destroy_aliasactual(*data);
973
3.65k
    break;
974
10.5k
  case CIL_CATORDER:
975
10.5k
    cil_destroy_ordered(*data);
976
10.5k
    break;
977
8.95k
  case CIL_LEVEL:
978
8.95k
    cil_destroy_level(*data);
979
8.95k
    break;
980
8.61k
  case CIL_LEVELRANGE:
981
8.61k
    cil_destroy_levelrange(*data);
982
8.61k
    break;
983
14.1k
  case CIL_SID:
984
14.1k
    cil_destroy_sid(*data);
985
14.1k
    break;
986
22.1k
  case CIL_SIDORDER:
987
22.1k
    cil_destroy_ordered(*data);
988
22.1k
    break;
989
6.42k
  case CIL_ROLEALLOW:
990
6.42k
    cil_destroy_roleallow(*data);
991
6.42k
    break;
992
877k
  case CIL_AVRULE:
993
901k
  case CIL_AVRULEX:
994
901k
    cil_destroy_avrule(*data);
995
901k
    break;
996
3.54k
  case CIL_PERMISSIONX:
997
3.54k
    cil_destroy_permissionx(*data);
998
3.54k
    break;
999
28.8k
  case CIL_DENY_RULE:
1000
28.8k
    cil_destroy_deny_rule(*data);
1001
28.8k
    break;
1002
17.4k
  case CIL_ROLETRANSITION:
1003
17.4k
    cil_destroy_roletransition(*data);
1004
17.4k
    break;
1005
32.7k
  case CIL_TYPE_RULE:
1006
32.7k
    cil_destroy_type_rule(*data);
1007
32.7k
    break;
1008
39.8k
  case CIL_NAMETYPETRANSITION:
1009
39.8k
    cil_destroy_typetransition(*data);
1010
39.8k
    break;
1011
21.2k
  case CIL_RANGETRANSITION:
1012
21.2k
    cil_destroy_rangetransition(*data);
1013
21.2k
    break;
1014
45.2k
  case CIL_CONSTRAIN:
1015
45.2k
    cil_destroy_constrain(*data);
1016
45.2k
    break;
1017
29.2k
  case CIL_MLSCONSTRAIN:
1018
29.2k
    cil_destroy_constrain(*data);
1019
29.2k
    break;
1020
76.3k
  case CIL_VALIDATETRANS:
1021
82.8k
  case CIL_MLSVALIDATETRANS:
1022
82.8k
    cil_destroy_validatetrans(*data);
1023
82.8k
    break;
1024
7.62k
  case CIL_CONTEXT:
1025
7.62k
    cil_destroy_context(*data);
1026
7.62k
    break;
1027
5.31k
  case CIL_IPADDR:
1028
5.31k
    cil_destroy_ipaddr(*data);
1029
5.31k
    break;
1030
0
  case CIL_DECLARED_STRING:
1031
0
    break;
1032
9.48k
  case CIL_SIDCONTEXT:
1033
9.48k
    cil_destroy_sidcontext(*data);
1034
9.48k
    break;
1035
59.3k
  case CIL_FSUSE:
1036
59.3k
    cil_destroy_fsuse(*data);
1037
59.3k
    break;
1038
276k
  case CIL_FILECON:
1039
276k
    cil_destroy_filecon(*data);
1040
276k
    break;
1041
220k
  case CIL_IBPKEYCON:
1042
220k
    cil_destroy_ibpkeycon(*data);
1043
220k
    break;
1044
44.7k
  case CIL_PORTCON:
1045
44.7k
    cil_destroy_portcon(*data);
1046
44.7k
    break;
1047
357k
  case CIL_IBENDPORTCON:
1048
357k
    cil_destroy_ibendportcon(*data);
1049
357k
    break;
1050
88.1k
  case CIL_NODECON:
1051
88.1k
    cil_destroy_nodecon(*data);
1052
88.1k
    break;
1053
12.4k
  case CIL_GENFSCON:
1054
12.4k
    cil_destroy_genfscon(*data);
1055
12.4k
    break;
1056
8.78k
  case CIL_NETIFCON:
1057
8.78k
    cil_destroy_netifcon(*data);
1058
8.78k
    break;
1059
19.6k
  case CIL_PIRQCON:
1060
19.6k
    cil_destroy_pirqcon(*data);
1061
19.6k
    break;
1062
8.54k
  case CIL_IOMEMCON:
1063
8.54k
    cil_destroy_iomemcon(*data);
1064
8.54k
    break;
1065
137k
  case CIL_IOPORTCON:
1066
137k
    cil_destroy_ioportcon(*data);
1067
137k
    break;
1068
12.3k
  case CIL_PCIDEVICECON:
1069
12.3k
    cil_destroy_pcidevicecon(*data);
1070
12.3k
    break;
1071
30.9k
  case CIL_DEVICETREECON:
1072
30.9k
    cil_destroy_devicetreecon(*data);
1073
30.9k
    break;
1074
3.84k
  case CIL_POLICYCAP:
1075
3.84k
    cil_destroy_policycap(*data);
1076
3.84k
    break;
1077
53.3k
  case CIL_DEFAULTUSER:
1078
75.1k
  case CIL_DEFAULTROLE:
1079
81.1k
  case CIL_DEFAULTTYPE:
1080
81.1k
    cil_destroy_default(*data);
1081
81.1k
    break;
1082
29.5k
  case CIL_DEFAULTRANGE:
1083
29.5k
    cil_destroy_defaultrange(*data);
1084
29.5k
    break;
1085
2.78k
  case CIL_HANDLEUNKNOWN:
1086
2.78k
    cil_destroy_handleunknown(*data);
1087
2.78k
    break;
1088
4.72k
  case CIL_MLS:
1089
4.72k
    cil_destroy_mls(*data);
1090
4.72k
    break;
1091
15.6k
  case CIL_SRC_INFO:
1092
15.6k
    cil_destroy_src_info(*data);
1093
15.6k
    break;
1094
538k
  case CIL_OP:
1095
915k
  case CIL_CONS_OPERAND:
1096
915k
    break;
1097
0
  default:
1098
0
    cil_log(CIL_INFO, "Unknown data flavor: %d\n", flavor);
1099
0
    break;
1100
11.3M
  }
1101
1102
11.3M
  *data = NULL;
1103
11.3M
}
1104
1105
int cil_flavor_to_symtab_index(enum cil_flavor flavor, enum cil_sym_index *sym_index)
1106
1.94M
{
1107
1.94M
  if (flavor < CIL_MIN_DECLARATIVE) {
1108
0
    return SEPOL_ERR;
1109
0
  }
1110
1111
1.94M
  switch(flavor) {
1112
415k
  case CIL_BLOCK:
1113
415k
    *sym_index = CIL_SYM_BLOCKS;
1114
415k
    break;
1115
13.8k
  case CIL_MACRO:
1116
13.8k
    *sym_index = CIL_SYM_BLOCKS;
1117
13.8k
    break;
1118
359k
  case CIL_OPTIONAL:
1119
359k
    *sym_index = CIL_SYM_BLOCKS;
1120
359k
    break;
1121
28.0k
  case CIL_BOOL:
1122
28.0k
    *sym_index = CIL_SYM_BOOLS;
1123
28.0k
    break;
1124
794
  case CIL_TUNABLE:
1125
794
    *sym_index = CIL_SYM_TUNABLES;
1126
794
    break;
1127
9.58k
  case CIL_PERM:
1128
13.0k
  case CIL_MAP_PERM:
1129
13.0k
    *sym_index = CIL_SYM_PERMS;
1130
13.0k
    break;
1131
389
  case CIL_COMMON:
1132
389
    *sym_index = CIL_SYM_COMMONS;
1133
389
    break;
1134
5.72k
  case CIL_CLASS:
1135
9.00k
  case CIL_MAP_CLASS:
1136
9.00k
    *sym_index = CIL_SYM_CLASSES;
1137
9.00k
    break;
1138
64.3k
  case CIL_CLASSPERMISSION:
1139
64.3k
  case CIL_CLASSPERMISSIONSET:
1140
64.3k
    *sym_index = CIL_SYM_CLASSPERMSETS;
1141
64.3k
    break;
1142
37.6k
  case CIL_USER:
1143
58.8k
  case CIL_USERATTRIBUTE:
1144
58.8k
    *sym_index = CIL_SYM_USERS;
1145
58.8k
    break;
1146
36.8k
  case CIL_ROLE:
1147
42.5k
  case CIL_ROLEATTRIBUTE:
1148
42.5k
    *sym_index = CIL_SYM_ROLES;
1149
42.5k
    break;
1150
748k
  case CIL_TYPE:
1151
749k
  case CIL_TYPEALIAS:
1152
866k
  case CIL_TYPEATTRIBUTE:
1153
866k
    *sym_index = CIL_SYM_TYPES;
1154
866k
    break;
1155
8.43k
  case CIL_SENS:
1156
10.8k
  case CIL_SENSALIAS:
1157
10.8k
    *sym_index = CIL_SYM_SENS;
1158
10.8k
    break;
1159
3.75k
  case CIL_CAT:
1160
9.42k
  case CIL_CATSET:
1161
12.4k
  case CIL_CATALIAS:
1162
12.4k
    *sym_index = CIL_SYM_CATS;
1163
12.4k
    break;
1164
13.7k
  case CIL_LEVEL:
1165
13.7k
    *sym_index = CIL_SYM_LEVELS;
1166
13.7k
    break;
1167
6.92k
  case CIL_LEVELRANGE:
1168
6.92k
    *sym_index = CIL_SYM_LEVELRANGES;
1169
6.92k
    break;
1170
1.44k
  case CIL_SID:
1171
1.44k
    *sym_index = CIL_SYM_SIDS;
1172
1.44k
    break;
1173
1.34k
  case CIL_DECLARED_STRING:
1174
1.34k
    *sym_index = CIL_SYM_STRINGS;
1175
1.34k
    break;
1176
6.43k
  case CIL_CONTEXT:
1177
6.43k
    *sym_index = CIL_SYM_CONTEXTS;
1178
6.43k
    break;
1179
8.51k
  case CIL_IPADDR:
1180
8.51k
    *sym_index = CIL_SYM_IPADDRS;
1181
8.51k
    break;
1182
4.66k
  case CIL_POLICYCAP:
1183
4.66k
    *sym_index = CIL_SYM_POLICYCAPS;
1184
4.66k
    break;
1185
2.18k
  case CIL_PERMISSIONX:
1186
2.18k
    *sym_index = CIL_SYM_PERMX;
1187
2.18k
    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.94M
  }
1193
1194
1.94M
  return SEPOL_OK;
1195
1.94M
}
1196
1197
const char * cil_node_to_string(struct cil_tree_node *node)
1198
949k
{
1199
949k
  switch (node->flavor) {
1200
0
  case CIL_NONE:
1201
0
    return "<none>";
1202
54.3k
  case CIL_ROOT:
1203
54.3k
    return CIL_KEY_ROOT;
1204
30
  case CIL_NODE:
1205
30
    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
427k
  case CIL_BLOCK:
1219
427k
    return CIL_KEY_BLOCK;
1220
72.4k
  case CIL_BLOCKINHERIT:
1221
72.4k
    return CIL_KEY_BLOCKINHERIT;
1222
15
  case CIL_BLOCKABSTRACT:
1223
15
    return CIL_KEY_BLOCKABSTRACT;
1224
47
  case CIL_IN:
1225
47
    return CIL_KEY_IN;
1226
77
  case CIL_MACRO:
1227
77
    return CIL_KEY_MACRO;
1228
39.9k
  case CIL_CALL:
1229
39.9k
    return CIL_KEY_CALL;
1230
1.95k
  case CIL_OPTIONAL:
1231
1.95k
    return CIL_KEY_OPTIONAL;
1232
9
  case CIL_BOOL:
1233
9
    return CIL_KEY_BOOL;
1234
6.49k
  case CIL_BOOLEANIF:
1235
6.49k
    return CIL_KEY_BOOLEANIF;
1236
19
  case CIL_TUNABLE:
1237
19
    return CIL_KEY_TUNABLE;
1238
290
  case CIL_TUNABLEIF:
1239
290
    return CIL_KEY_TUNABLEIF;
1240
5.52k
  case CIL_CONDBLOCK:
1241
5.52k
    switch (((struct cil_condblock*)node->data)->flavor) {
1242
4.98k
    case CIL_CONDTRUE:
1243
4.98k
      return CIL_KEY_CONDTRUE;
1244
544
    case CIL_CONDFALSE:
1245
544
      return CIL_KEY_CONDFALSE;
1246
0
    default:
1247
0
      break;
1248
5.52k
    }
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
82
  case CIL_PERM:
1255
82
    return CIL_KEY_PERM;
1256
7
  case CIL_COMMON:
1257
7
    return CIL_KEY_COMMON;
1258
22
  case CIL_CLASS:
1259
22
    return CIL_KEY_CLASS;
1260
1
  case CIL_CLASSORDER:
1261
1
    return CIL_KEY_CLASSORDER;
1262
5
  case CIL_MAP_CLASS:
1263
5
    return CIL_KEY_MAP_CLASS;
1264
6
  case CIL_CLASSPERMISSION:
1265
6
    return CIL_KEY_CLASSPERMISSION;
1266
1.30k
  case CIL_CLASSCOMMON:
1267
1.30k
    return CIL_KEY_CLASSCOMMON;
1268
1.17k
  case CIL_CLASSMAPPING:
1269
1.17k
    return CIL_KEY_CLASSMAPPING;
1270
477
  case CIL_CLASSPERMISSIONSET:
1271
477
    return CIL_KEY_CLASSPERMISSIONSET;
1272
510
  case CIL_USER:
1273
510
    return CIL_KEY_USER;
1274
11
  case CIL_USERATTRIBUTE:
1275
11
    return CIL_KEY_USERATTRIBUTE;
1276
2.33k
  case CIL_USERATTRIBUTESET:
1277
2.33k
    return CIL_KEY_USERATTRIBUTESET;
1278
281
  case CIL_USERPREFIX:
1279
281
    return CIL_KEY_USERPREFIX;
1280
1.45k
  case CIL_USERROLE:
1281
1.45k
    return CIL_KEY_USERROLE;
1282
2.76k
  case CIL_USERLEVEL:
1283
2.76k
    return CIL_KEY_USERLEVEL;
1284
2.46k
  case CIL_USERRANGE:
1285
2.46k
    return CIL_KEY_USERRANGE;
1286
814
  case CIL_USERBOUNDS:
1287
814
    return CIL_KEY_USERBOUNDS;
1288
769
  case CIL_SELINUXUSER:
1289
769
    return CIL_KEY_SELINUXUSER;
1290
457
  case CIL_SELINUXUSERDEFAULT:
1291
457
    return CIL_KEY_SELINUXUSERDEFAULT;
1292
9
  case CIL_ROLE:
1293
9
    return CIL_KEY_ROLE;
1294
14
  case CIL_ROLEATTRIBUTE:
1295
14
    return CIL_KEY_ROLEATTRIBUTE;
1296
1.56k
  case CIL_ROLEATTRIBUTESET:
1297
1.56k
    return CIL_KEY_ROLEATTRIBUTESET;
1298
923
  case CIL_ROLETYPE:
1299
923
    return CIL_KEY_ROLETYPE;
1300
591
  case CIL_ROLEBOUNDS:
1301
591
    return CIL_KEY_ROLEBOUNDS;
1302
98
  case CIL_TYPE:
1303
98
    return CIL_KEY_TYPE;
1304
233
  case CIL_TYPEATTRIBUTE:
1305
233
    return CIL_KEY_TYPEATTRIBUTE;
1306
9
  case CIL_TYPEALIAS:
1307
9
    return CIL_KEY_TYPEALIAS;
1308
1.11k
  case CIL_TYPEATTRIBUTESET:
1309
1.11k
    return CIL_KEY_TYPEATTRIBUTESET;
1310
2.97k
  case CIL_EXPANDTYPEATTRIBUTE:
1311
2.97k
    return CIL_KEY_EXPANDTYPEATTRIBUTE;
1312
534
  case CIL_TYPEALIASACTUAL:
1313
534
    return CIL_KEY_TYPEALIASACTUAL;
1314
9.19k
  case CIL_TYPEBOUNDS:
1315
9.19k
    return CIL_KEY_TYPEBOUNDS;
1316
403
  case CIL_TYPEPERMISSIVE:
1317
403
    return CIL_KEY_TYPEPERMISSIVE;
1318
433
  case CIL_TYPENEVERAUDIT:
1319
433
    return CIL_KEY_TYPENEVERAUDIT;
1320
117
  case CIL_SENS:
1321
117
    return CIL_KEY_SENSITIVITY;
1322
11
  case CIL_SENSALIAS:
1323
11
    return CIL_KEY_SENSALIAS;
1324
494
  case CIL_SENSALIASACTUAL:
1325
494
    return CIL_KEY_SENSALIASACTUAL;
1326
360
  case CIL_SENSITIVITYORDER:
1327
360
    return CIL_KEY_SENSITIVITYORDER;
1328
1.87k
  case CIL_SENSCAT:
1329
1.87k
    return CIL_KEY_SENSCAT;
1330
16
  case CIL_CAT:
1331
16
    return CIL_KEY_CATEGORY;
1332
267
  case CIL_CATSET:
1333
267
    return CIL_KEY_CATSET;
1334
11
  case CIL_CATALIAS:
1335
11
    return CIL_KEY_CATALIAS;
1336
650
  case CIL_CATALIASACTUAL:
1337
650
    return CIL_KEY_CATALIASACTUAL;
1338
1.25k
  case CIL_CATORDER:
1339
1.25k
    return CIL_KEY_CATORDER;
1340
801
  case CIL_LEVEL:
1341
801
    return CIL_KEY_LEVEL;
1342
1.30k
  case CIL_LEVELRANGE:
1343
1.30k
    return CIL_KEY_LEVELRANGE;
1344
165
  case CIL_SID:
1345
165
    return CIL_KEY_SID;
1346
438
  case CIL_SIDORDER:
1347
438
    return CIL_KEY_SIDORDER;
1348
565
  case CIL_ROLEALLOW:
1349
565
    return CIL_KEY_ROLEALLOW;
1350
83.3k
  case CIL_AVRULE:
1351
83.3k
    switch (((struct cil_avrule *)node->data)->rule_kind) {
1352
60.5k
    case CIL_AVRULE_ALLOWED:
1353
60.5k
      return CIL_KEY_ALLOW;
1354
184
    case CIL_AVRULE_AUDITALLOW:
1355
184
      return CIL_KEY_AUDITALLOW;
1356
179
    case CIL_AVRULE_DONTAUDIT:
1357
179
      return CIL_KEY_DONTAUDIT;
1358
22.4k
    case CIL_AVRULE_NEVERALLOW:
1359
22.4k
      return CIL_KEY_NEVERALLOW;
1360
0
    default:
1361
0
      break;
1362
83.3k
    }
1363
0
    break;
1364
5.24k
  case CIL_AVRULEX:
1365
5.24k
    switch (((struct cil_avrule *)node->data)->rule_kind) {
1366
1.07k
    case CIL_AVRULE_ALLOWED:
1367
1.07k
      return CIL_KEY_ALLOWX;
1368
1.14k
    case CIL_AVRULE_AUDITALLOW:
1369
1.14k
      return CIL_KEY_AUDITALLOWX;
1370
2.80k
    case CIL_AVRULE_DONTAUDIT:
1371
2.80k
      return CIL_KEY_DONTAUDITX;
1372
231
    case CIL_AVRULE_NEVERALLOW:
1373
231
      return CIL_KEY_NEVERALLOWX;
1374
0
    default:
1375
0
      break;
1376
5.24k
    }
1377
0
    break;
1378
611
  case CIL_PERMISSIONX:
1379
611
    return CIL_KEY_PERMISSIONX;
1380
3.70k
  case CIL_DENY_RULE:
1381
3.70k
    return CIL_KEY_DENY_RULE;
1382
5.90k
  case CIL_ROLETRANSITION:
1383
5.90k
    return CIL_KEY_ROLETRANSITION;
1384
2.54k
  case CIL_TYPE_RULE:
1385
2.54k
    switch (((struct cil_type_rule *)node->data)->rule_kind) {
1386
1.48k
    case CIL_TYPE_TRANSITION:
1387
1.48k
      return CIL_KEY_TYPETRANSITION;
1388
712
    case CIL_TYPE_MEMBER:
1389
712
      return CIL_KEY_TYPEMEMBER;
1390
346
    case CIL_TYPE_CHANGE:
1391
346
      return CIL_KEY_TYPECHANGE;
1392
0
    default:
1393
0
      break;
1394
2.54k
    }
1395
0
    break;
1396
3.84k
  case CIL_NAMETYPETRANSITION:
1397
3.84k
    return CIL_KEY_TYPETRANSITION;
1398
3.73k
  case CIL_RANGETRANSITION:
1399
3.73k
    return CIL_KEY_RANGETRANSITION;
1400
18.9k
  case CIL_CONSTRAIN:
1401
18.9k
    return CIL_KEY_CONSTRAIN;
1402
1.73k
  case CIL_MLSCONSTRAIN:
1403
1.73k
    return CIL_KEY_MLSCONSTRAIN;
1404
1.28k
  case CIL_VALIDATETRANS:
1405
1.28k
    return CIL_KEY_VALIDATETRANS;
1406
220
  case CIL_MLSVALIDATETRANS:
1407
220
    return CIL_KEY_MLSVALIDATETRANS;
1408
4.04k
  case CIL_CONTEXT:
1409
4.04k
    return CIL_KEY_CONTEXT;
1410
10
  case CIL_IPADDR:
1411
10
    return CIL_KEY_IPADDR;
1412
601
  case CIL_SIDCONTEXT:
1413
601
    return CIL_KEY_SIDCONTEXT;
1414
4.29k
  case CIL_FSUSE:
1415
4.29k
    return CIL_KEY_FSUSE;
1416
1.73k
  case CIL_FILECON:
1417
1.73k
    return CIL_KEY_FILECON;
1418
22.8k
  case CIL_IBPKEYCON:
1419
22.8k
    return CIL_KEY_IBPKEYCON;
1420
1.29k
  case CIL_IBENDPORTCON:
1421
1.29k
    return CIL_KEY_IBENDPORTCON;
1422
2.61k
  case CIL_PORTCON:
1423
2.61k
    return CIL_KEY_PORTCON;
1424
75.1k
  case CIL_NODECON:
1425
75.1k
    return CIL_KEY_NODECON;
1426
2.56k
  case CIL_GENFSCON:
1427
2.56k
    return CIL_KEY_GENFSCON;
1428
3.51k
  case CIL_NETIFCON:
1429
3.51k
    return CIL_KEY_NETIFCON;
1430
3.86k
  case CIL_PIRQCON:
1431
3.86k
    return CIL_KEY_PIRQCON;
1432
2.06k
  case CIL_IOMEMCON:
1433
2.06k
    return CIL_KEY_IOMEMCON;
1434
2.97k
  case CIL_IOPORTCON:
1435
2.97k
    return CIL_KEY_IOPORTCON;
1436
6.71k
  case CIL_PCIDEVICECON:
1437
6.71k
    return CIL_KEY_PCIDEVICECON;
1438
26.5k
  case CIL_DEVICETREECON:
1439
26.5k
    return CIL_KEY_DEVICETREECON;
1440
255
  case CIL_POLICYCAP:
1441
255
    return CIL_KEY_POLICYCAP;
1442
5.01k
  case CIL_DEFAULTUSER:
1443
5.01k
    return CIL_KEY_DEFAULTUSER;
1444
1.39k
  case CIL_DEFAULTROLE:
1445
1.39k
    return CIL_KEY_DEFAULTROLE;
1446
628
  case CIL_DEFAULTTYPE:
1447
628
    return CIL_KEY_DEFAULTTYPE;
1448
492
  case CIL_DEFAULTRANGE:
1449
492
    return CIL_KEY_DEFAULTRANGE;
1450
0
  case CIL_HANDLEUNKNOWN:
1451
0
    return CIL_KEY_HANDLEUNKNOWN;
1452
3
  case CIL_MLS:
1453
3
    return CIL_KEY_MLS;
1454
5
  case CIL_SRC_INFO:
1455
5
    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
2
  default:
1506
2
    break;
1507
949k
  }
1508
1509
2
  return "<unknown>";
1510
949k
}
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
13.9k
{
1930
13.9k
  db->disable_dontaudit = disable_dontaudit;
1931
13.9k
}
1932
1933
void cil_set_disable_neverallow(struct cil_db *db, int disable_neverallow)
1934
13.9k
{
1935
13.9k
  db->disable_neverallow = disable_neverallow;
1936
13.9k
}
1937
1938
void cil_set_attrs_expand_generated(struct cil_db *db, int attrs_expand_generated)
1939
13.9k
{
1940
13.9k
  db->attrs_expand_generated = attrs_expand_generated;
1941
13.9k
}
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
13.9k
{
1950
13.9k
  db->preserve_tunables = preserve_tunables;
1951
13.9k
}
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
13.9k
{
1973
13.9k
  db->mls = mls;
1974
13.9k
}
1975
1976
void cil_set_multiple_decls(struct cil_db *db, int multiple_decls)
1977
13.9k
{
1978
13.9k
  db->multiple_decls = multiple_decls;
1979
13.9k
}
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
13.9k
{
1988
13.9k
  db->target_platform = target_platform;
1989
13.9k
}
1990
1991
void cil_set_policy_version(struct cil_db *db, int policy_version)
1992
13.9k
{
1993
13.9k
  db->policy_version = policy_version;
1994
13.9k
}
1995
1996
void cil_symtab_array_init(symtab_t symtab[], const int symtab_sizes[CIL_SYM_NUM])
1997
725k
{
1998
725k
  uint32_t i = 0;
1999
14.5M
  for (i = 0; i < CIL_SYM_NUM; i++) {
2000
13.7M
    cil_symtab_init(&symtab[i], symtab_sizes[i]);
2001
13.7M
  }
2002
725k
}
2003
2004
void cil_symtab_array_destroy(symtab_t symtab[])
2005
725k
{
2006
725k
  int i = 0;
2007
14.5M
  for (i = 0; i < CIL_SYM_NUM; i++) {
2008
13.7M
    cil_symtab_destroy(&symtab[i]);
2009
13.7M
  }
2010
725k
}
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.96M
{
2047
1.96M
  struct cil_tree_node *node = ast_node;
2048
1.96M
  *symtab = NULL;
2049
  
2050
1.96M
  if (sym_index == CIL_SYM_PERMS) {
2051
    /* Class statements are not blocks, so the passed node should be the class */
2052
114k
    if (node->flavor == CIL_CLASS || node->flavor == CIL_MAP_CLASS ||
2053
114k
      node->flavor == CIL_COMMON) {
2054
114k
      *symtab = &((struct cil_class*)node->data)->perms;
2055
114k
      return SEPOL_OK;
2056
114k
    }
2057
0
    goto exit;
2058
114k
  }
2059
2060
1.85M
  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.24M
  while (node != NULL && *symtab == NULL) {
2066
3.38M
    switch (node->flavor) {
2067
411k
    case CIL_ROOT:
2068
411k
      *symtab = &((struct cil_root *)node->data)->symtab[sym_index];
2069
411k
      break;
2070
1.40M
    case CIL_BLOCK:
2071
1.40M
      *symtab = &((struct cil_block*)node->data)->symtab[sym_index];
2072
1.40M
      break;
2073
13.8k
    case CIL_MACRO:
2074
13.8k
      *symtab = &((struct cil_macro*)node->data)->symtab[sym_index];
2075
13.8k
      break;
2076
24.2k
    case CIL_IN:
2077
      /* In blocks only exist before resolving the AST */
2078
24.2k
      *symtab = &((struct cil_in*)node->data)->symtab[sym_index];
2079
24.2k
      break;
2080
2.48k
    case CIL_CONDBLOCK: {
2081
2.48k
      if (node->parent->flavor == CIL_TUNABLEIF) {
2082
        /* Cond blocks only exist before resolving the AST */
2083
2.14k
        *symtab = &((struct cil_condblock*)node->data)->symtab[sym_index];
2084
2.14k
      } else if (node->parent->flavor == CIL_BOOLEANIF) {
2085
340
        node = node->parent->parent;
2086
340
      }
2087
2.48k
      break;
2088
0
    }
2089
1.53M
    default:
2090
1.53M
      node = node->parent;
2091
3.38M
    }
2092
3.38M
  }
2093
2094
1.85M
  if (*symtab == NULL) {
2095
0
    goto exit;
2096
0
  }
2097
2098
1.85M
  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.85M
}
2104
2105
int cil_string_to_uint32(const char *string, uint32_t *value, int base)
2106
36.6k
{
2107
36.6k
  unsigned long val;
2108
36.6k
  char *end = NULL;
2109
36.6k
  int rc = SEPOL_ERR;
2110
2111
36.6k
  if (string == NULL || value  == NULL) {
2112
6
    goto exit;
2113
6
  }
2114
2115
36.6k
  errno = 0;
2116
36.6k
  val = strtoul(string, &end, base);
2117
36.6k
  if (errno != 0 || end == string || *end != '\0') {
2118
54
    rc = SEPOL_ERR;
2119
54
    goto exit;
2120
54
  }
2121
2122
  /* Ensure that the value fits a 32-bit integer without triggering -Wtype-limits */
2123
36.5k
#if ULONG_MAX > UINT32_MAX
2124
36.5k
  if (val > UINT32_MAX) {
2125
61
    rc = SEPOL_ERR;
2126
61
    goto exit;
2127
61
  }
2128
36.5k
#endif
2129
2130
36.5k
  *value = val;
2131
2132
36.5k
  return SEPOL_OK;
2133
2134
121
exit:
2135
121
  cil_log(CIL_ERR, "Failed to create uint32_t from string\n");
2136
121
  return rc;
2137
36.5k
}
2138
2139
int cil_string_to_uint64(const char *string, uint64_t *value, int base)
2140
4.05k
{
2141
4.05k
  char *end = NULL;
2142
4.05k
  int rc = SEPOL_ERR;
2143
2144
4.05k
  if (string == NULL || value  == NULL) {
2145
0
    goto exit;
2146
0
  }
2147
2148
4.05k
  errno = 0;
2149
4.05k
  *value = strtoull(string, &end, base);
2150
4.05k
  if (errno != 0 || end == string || *end != '\0') {
2151
11
    rc = SEPOL_ERR;
2152
11
    goto exit;
2153
11
  }
2154
2155
4.04k
  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.05k
}
2161
2162
void cil_sort_init(struct cil_sort **sort)
2163
181k
{
2164
181k
  *sort = cil_malloc(sizeof(**sort));
2165
2166
181k
  (*sort)->flavor = CIL_NONE;
2167
181k
  (*sort)->count = 0;
2168
181k
  (*sort)->index = 0;
2169
181k
  (*sort)->array = NULL;
2170
181k
}
2171
2172
void cil_sort_destroy(struct cil_sort **sort)
2173
181k
{
2174
181k
  (*sort)->flavor = CIL_NONE;
2175
181k
  (*sort)->count = 0;
2176
181k
  (*sort)->index = 0;
2177
181k
  if ((*sort)->array != NULL) {
2178
5.06k
    free((*sort)->array);
2179
5.06k
  }
2180
181k
  (*sort)->array = NULL;
2181
2182
181k
  free(*sort);
2183
181k
  *sort = NULL;
2184
181k
}
2185
2186
void cil_ordered_init(struct cil_ordered **ordered)
2187
72.3k
{
2188
72.3k
  *ordered = cil_malloc(sizeof(**ordered));
2189
72.3k
  (*ordered)->merged = CIL_FALSE;
2190
72.3k
  (*ordered)->strs = NULL;
2191
72.3k
  (*ordered)->datums = NULL;
2192
72.3k
}
2193
2194
void cil_netifcon_init(struct cil_netifcon **netifcon)
2195
8.79k
{
2196
8.79k
  *netifcon = cil_malloc(sizeof(**netifcon));
2197
2198
8.79k
  (*netifcon)->interface_str = NULL;
2199
8.79k
  (*netifcon)->if_context_str = NULL;
2200
8.79k
  (*netifcon)->if_context = NULL;
2201
8.79k
  (*netifcon)->packet_context_str = NULL;
2202
8.79k
  (*netifcon)->packet_context = NULL;
2203
8.79k
  (*netifcon)->context_str = NULL;
2204
8.79k
}
2205
2206
void cil_ibendportcon_init(struct cil_ibendportcon **ibendportcon)
2207
357k
{
2208
357k
  *ibendportcon = cil_malloc(sizeof(**ibendportcon));
2209
2210
357k
  (*ibendportcon)->dev_name_str = NULL;
2211
357k
  (*ibendportcon)->port = 0;
2212
357k
  (*ibendportcon)->context_str = NULL;
2213
357k
  (*ibendportcon)->context = NULL;
2214
357k
}
2215
2216
void cil_context_init(struct cil_context **context)
2217
936k
{
2218
936k
  *context = cil_malloc(sizeof(**context));
2219
2220
936k
  cil_symtab_datum_init(&(*context)->datum);
2221
936k
  (*context)->user_str = NULL;
2222
936k
  (*context)->user = NULL;
2223
936k
  (*context)->role_str = NULL;
2224
936k
  (*context)->role = NULL;
2225
936k
  (*context)->type_str = NULL;
2226
936k
  (*context)->type = NULL;
2227
936k
  (*context)->range_str = NULL;
2228
936k
  (*context)->range = NULL;
2229
936k
}
2230
2231
void cil_level_init(struct cil_level **level)
2232
1.75M
{
2233
1.75M
  *level = cil_malloc(sizeof(**level));
2234
2235
1.75M
  cil_symtab_datum_init(&(*level)->datum);
2236
1.75M
  (*level)->sens_str = NULL;
2237
1.75M
  (*level)->sens = NULL;
2238
1.75M
  (*level)->cats = NULL;
2239
1.75M
}
2240
2241
void cil_levelrange_init(struct cil_levelrange **range)
2242
897k
{
2243
897k
  *range = cil_malloc(sizeof(**range));
2244
2245
897k
  cil_symtab_datum_init(&(*range)->datum);
2246
897k
  (*range)->low_str = NULL;
2247
897k
  (*range)->low = NULL;
2248
897k
  (*range)->high_str = NULL;
2249
897k
  (*range)->high = NULL;
2250
897k
}
2251
2252
void cil_sens_init(struct cil_sens **sens)
2253
7.28k
{
2254
7.28k
  *sens = cil_malloc(sizeof(**sens));
2255
2256
7.28k
  cil_symtab_datum_init(&(*sens)->datum);
2257
2258
7.28k
  (*sens)->cats_list = NULL;
2259
2260
7.28k
  (*sens)->ordered = CIL_FALSE;
2261
7.28k
}
2262
2263
void cil_block_init(struct cil_block **block)
2264
447k
{
2265
447k
  *block = cil_malloc(sizeof(**block));
2266
2267
447k
  cil_symtab_datum_init(&(*block)->datum);
2268
2269
447k
  cil_symtab_array_init((*block)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_BLOCK]);
2270
2271
447k
  (*block)->is_abstract = CIL_FALSE;
2272
2273
447k
  (*block)->bi_nodes = NULL;
2274
447k
}
2275
2276
void cil_blockinherit_init(struct cil_blockinherit **inherit)
2277
190k
{
2278
190k
  *inherit = cil_malloc(sizeof(**inherit));
2279
190k
  (*inherit)->block_str = NULL;
2280
190k
  (*inherit)->block = NULL;
2281
190k
}
2282
2283
void cil_blockabstract_init(struct cil_blockabstract **abstract)
2284
1.39k
{
2285
1.39k
  *abstract = cil_malloc(sizeof(**abstract));
2286
1.39k
  (*abstract)->block_str = NULL;
2287
1.39k
  (*abstract)->block = NULL;
2288
1.39k
}
2289
2290
void cil_in_init(struct cil_in **in)
2291
17.2k
{
2292
17.2k
  *in = cil_malloc(sizeof(**in));
2293
2294
17.2k
  cil_symtab_array_init((*in)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_IN]);
2295
17.2k
  (*in)->is_after = CIL_FALSE;
2296
17.2k
  (*in)->block_str = NULL;
2297
17.2k
  (*in)->block = NULL;
2298
17.2k
}
2299
2300
void cil_class_init(struct cil_class **class)
2301
38.7k
{
2302
38.7k
  *class = cil_malloc(sizeof(**class));
2303
2304
38.7k
  cil_symtab_datum_init(&(*class)->datum);
2305
2306
38.7k
  cil_symtab_init(&(*class)->perms, CIL_CLASS_SYM_SIZE);
2307
2308
38.7k
  (*class)->num_perms = 0;
2309
38.7k
  (*class)->common = NULL;
2310
38.7k
  (*class)->ordered = CIL_FALSE;
2311
38.7k
}
2312
2313
void cil_classcommon_init(struct cil_classcommon **classcommon)
2314
5.63k
{
2315
5.63k
  *classcommon = cil_malloc(sizeof(**classcommon));
2316
2317
5.63k
  (*classcommon)->class_str = NULL;
2318
5.63k
  (*classcommon)->class = NULL;
2319
5.63k
  (*classcommon)->common_str = NULL;
2320
5.63k
  (*classcommon)->common = NULL;
2321
5.63k
}
2322
2323
void cil_sid_init(struct cil_sid **sid)
2324
14.2k
{
2325
14.2k
  *sid = cil_malloc(sizeof(**sid));
2326
2327
14.2k
  cil_symtab_datum_init(&(*sid)->datum);
2328
2329
14.2k
  (*sid)->ordered = CIL_FALSE;
2330
14.2k
  (*sid)->context = NULL;
2331
14.2k
}
2332
2333
void cil_sidcontext_init(struct cil_sidcontext **sidcontext)
2334
9.48k
{
2335
9.48k
  *sidcontext = cil_malloc(sizeof(**sidcontext));
2336
2337
9.48k
  (*sidcontext)->sid_str = NULL;
2338
9.48k
  (*sidcontext)->sid = NULL;
2339
9.48k
  (*sidcontext)->context_str = NULL;
2340
9.48k
  (*sidcontext)->context = NULL;
2341
9.48k
}
2342
2343
void cil_userrole_init(struct cil_userrole **userrole)
2344
23.0k
{
2345
23.0k
  *userrole = cil_malloc(sizeof(**userrole));
2346
2347
23.0k
  (*userrole)->user_str = NULL;
2348
23.0k
  (*userrole)->user = NULL;
2349
23.0k
  (*userrole)->role_str = NULL;
2350
23.0k
  (*userrole)->role = NULL;
2351
23.0k
}
2352
2353
void cil_userprefix_init(struct cil_userprefix **userprefix)
2354
1.68k
{
2355
1.68k
  *userprefix = cil_malloc(sizeof(**userprefix));
2356
2357
1.68k
  (*userprefix)->user_str = NULL;
2358
1.68k
  (*userprefix)->user = NULL;
2359
1.68k
  (*userprefix)->prefix_str = NULL;
2360
1.68k
}
2361
2362
void cil_selinuxuser_init(struct cil_selinuxuser **selinuxuser)
2363
3.39k
{
2364
3.39k
  *selinuxuser = cil_malloc(sizeof(**selinuxuser));
2365
2366
3.39k
  (*selinuxuser)->name_str = NULL;
2367
3.39k
  (*selinuxuser)->user_str = NULL;
2368
3.39k
  (*selinuxuser)->user = NULL;
2369
3.39k
  (*selinuxuser)->range_str = NULL;
2370
3.39k
  (*selinuxuser)->range = NULL;
2371
3.39k
}
2372
2373
void cil_roletype_init(struct cil_roletype **roletype)
2374
133k
{
2375
133k
  *roletype = cil_malloc(sizeof(**roletype));
2376
2377
133k
  (*roletype)->role_str = NULL;
2378
133k
  (*roletype)->role = NULL;
2379
133k
  (*roletype)->type_str = NULL;
2380
133k
  (*roletype)->type = NULL;
2381
133k
}
2382
2383
void cil_roleattribute_init(struct cil_roleattribute **attr)
2384
8.43k
{
2385
8.43k
  *attr = cil_malloc(sizeof(**attr));
2386
2387
8.43k
  cil_symtab_datum_init(&(*attr)->datum);
2388
2389
8.43k
  (*attr)->expr_list = NULL;
2390
8.43k
  (*attr)->roles = NULL;
2391
8.43k
}
2392
2393
void cil_roleattributeset_init(struct cil_roleattributeset **attrset)
2394
10.0k
{
2395
10.0k
  *attrset = cil_malloc(sizeof(**attrset));
2396
2397
10.0k
  (*attrset)->attr_str = NULL;
2398
10.0k
  (*attrset)->attr = NULL;
2399
10.0k
  (*attrset)->str_expr = NULL;
2400
10.0k
  (*attrset)->datum_expr = NULL;
2401
10.0k
}
2402
2403
void cil_typeattribute_init(struct cil_typeattribute **attr)
2404
143k
{
2405
143k
  *attr = cil_malloc(sizeof(**attr));
2406
2407
143k
  cil_symtab_datum_init(&(*attr)->datum);
2408
2409
143k
  (*attr)->expr_list = NULL;
2410
143k
  (*attr)->types = NULL;
2411
143k
  (*attr)->used = CIL_FALSE;
2412
143k
  (*attr)->keep = CIL_FALSE;
2413
143k
}
2414
2415
void cil_typeattributeset_init(struct cil_typeattributeset **attrset)
2416
141k
{
2417
141k
  *attrset = cil_malloc(sizeof(**attrset));
2418
2419
141k
  (*attrset)->attr_str = NULL;
2420
141k
  (*attrset)->attr = NULL;
2421
141k
  (*attrset)->str_expr = NULL;
2422
141k
  (*attrset)->datum_expr = NULL;
2423
141k
}
2424
2425
void cil_expandtypeattribute_init(struct cil_expandtypeattribute **expandattr)
2426
4.65k
{
2427
4.65k
  *expandattr = cil_malloc(sizeof(**expandattr));
2428
2429
4.65k
  (*expandattr)->attr_strs = NULL;
2430
4.65k
  (*expandattr)->attr_datums = NULL;
2431
4.65k
  (*expandattr)->expand = 0;
2432
4.65k
}
2433
2434
void cil_alias_init(struct cil_alias **alias)
2435
7.27k
{
2436
7.27k
  *alias = cil_malloc(sizeof(**alias));
2437
2438
7.27k
  (*alias)->actual = NULL;
2439
2440
7.27k
  cil_symtab_datum_init(&(*alias)->datum);
2441
7.27k
}
2442
2443
void cil_aliasactual_init(struct cil_aliasactual **aliasactual)
2444
8.54k
{
2445
8.54k
  *aliasactual = cil_malloc(sizeof(**aliasactual));
2446
2447
8.54k
  (*aliasactual)->alias_str = NULL;
2448
8.54k
  (*aliasactual)->alias = NULL;
2449
8.54k
  (*aliasactual)->actual_str = NULL;
2450
8.54k
  (*aliasactual)->actual = NULL;
2451
8.54k
}
2452
2453
void cil_typepermissive_init(struct cil_typepermissive **typeperm)
2454
2.48k
{
2455
2.48k
  *typeperm = cil_malloc(sizeof(**typeperm));
2456
2457
2.48k
  (*typeperm)->type_str = NULL;
2458
2.48k
  (*typeperm)->type = NULL;
2459
2.48k
}
2460
2461
void cil_typeneveraudit_init(struct cil_typeneveraudit **typeperm)
2462
1.29k
{
2463
1.29k
  *typeperm = cil_malloc(sizeof(**typeperm));
2464
2465
1.29k
  (*typeperm)->type_str = NULL;
2466
1.29k
  (*typeperm)->type = NULL;
2467
1.29k
}
2468
2469
void cil_nametypetransition_init(struct cil_nametypetransition **nametypetrans)
2470
39.8k
{
2471
39.8k
  *nametypetrans = cil_malloc(sizeof(**nametypetrans));
2472
2473
39.8k
  (*nametypetrans)->src_str = NULL;
2474
39.8k
  (*nametypetrans)->src = NULL;
2475
39.8k
  (*nametypetrans)->tgt_str = NULL;
2476
39.8k
  (*nametypetrans)->tgt = NULL;
2477
39.8k
  (*nametypetrans)->obj_str = NULL;
2478
39.8k
  (*nametypetrans)->obj = NULL;
2479
39.8k
  (*nametypetrans)->name_str = NULL;
2480
39.8k
  (*nametypetrans)->name = NULL;
2481
39.8k
  (*nametypetrans)->result_str = NULL;
2482
39.8k
  (*nametypetrans)->result = NULL;
2483
39.8k
}
2484
2485
void cil_rangetransition_init(struct cil_rangetransition **rangetrans)
2486
21.2k
{
2487
21.2k
        *rangetrans = cil_malloc(sizeof(**rangetrans));
2488
2489
21.2k
  (*rangetrans)->src_str = NULL;
2490
21.2k
  (*rangetrans)->src = NULL;
2491
21.2k
  (*rangetrans)->exec_str = NULL;
2492
21.2k
  (*rangetrans)->exec = NULL;
2493
21.2k
  (*rangetrans)->obj_str = NULL;
2494
21.2k
  (*rangetrans)->obj = NULL;
2495
21.2k
  (*rangetrans)->range_str = NULL;
2496
21.2k
  (*rangetrans)->range = NULL;
2497
21.2k
}
2498
2499
void cil_bool_init(struct cil_bool **cilbool)
2500
26.6k
{
2501
26.6k
  *cilbool = cil_malloc(sizeof(**cilbool));
2502
2503
26.6k
  cil_symtab_datum_init(&(*cilbool)->datum);
2504
26.6k
  (*cilbool)->value = 0;
2505
26.6k
}
2506
2507
void cil_tunable_init(struct cil_tunable **ciltun)
2508
2.20k
{
2509
2.20k
  *ciltun = cil_malloc(sizeof(**ciltun));
2510
2511
2.20k
  cil_symtab_datum_init(&(*ciltun)->datum);
2512
2.20k
  (*ciltun)->value = 0;
2513
2.20k
}
2514
2515
void cil_condblock_init(struct cil_condblock **cb)
2516
224k
{
2517
224k
  *cb = cil_malloc(sizeof(**cb));
2518
2519
224k
  (*cb)->flavor = CIL_NONE;
2520
224k
  cil_symtab_array_init((*cb)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_CONDBLOCK]);
2521
224k
}
2522
2523
void cil_boolif_init(struct cil_booleanif **bif)
2524
207k
{
2525
207k
  *bif = cil_malloc(sizeof(**bif));
2526
2527
207k
  (*bif)->str_expr = NULL;
2528
207k
  (*bif)->datum_expr = NULL;
2529
207k
}
2530
2531
void cil_tunif_init(struct cil_tunableif **tif)
2532
13.3k
{
2533
13.3k
  *tif = cil_malloc(sizeof(**tif));
2534
2535
13.3k
  (*tif)->str_expr = NULL;
2536
13.3k
  (*tif)->datum_expr = NULL;
2537
13.3k
}
2538
2539
void cil_avrule_init(struct cil_avrule **avrule)
2540
901k
{
2541
901k
  *avrule = cil_malloc(sizeof(**avrule));
2542
2543
901k
  (*avrule)->is_extended = 0;
2544
901k
  (*avrule)->rule_kind = CIL_NONE;
2545
901k
  (*avrule)->src_str = NULL;
2546
901k
  (*avrule)->src = NULL;
2547
901k
  (*avrule)->tgt_str = NULL;
2548
901k
  (*avrule)->tgt = NULL;
2549
901k
  memset(&((*avrule)->perms), 0, sizeof((*avrule)->perms));
2550
901k
}
2551
2552
void cil_permissionx_init(struct cil_permissionx **permx)
2553
18.4k
{
2554
18.4k
  *permx = cil_malloc(sizeof(**permx));
2555
2556
18.4k
  cil_symtab_datum_init(&(*permx)->datum);
2557
18.4k
  (*permx)->kind = CIL_NONE;
2558
18.4k
  (*permx)->obj_str = NULL;
2559
18.4k
  (*permx)->obj = NULL;
2560
18.4k
  (*permx)->expr_str = NULL;
2561
18.4k
  (*permx)->perms = NULL;
2562
18.4k
}
2563
2564
void cil_deny_rule_init(struct cil_deny_rule **rule)
2565
28.8k
{
2566
28.8k
  *rule = cil_malloc(sizeof(**rule));
2567
2568
28.8k
  (*rule)->src_str = NULL;
2569
28.8k
  (*rule)->src = NULL;
2570
28.8k
  (*rule)->tgt_str = NULL;
2571
28.8k
  (*rule)->tgt = NULL;
2572
28.8k
  (*rule)->classperms = NULL;
2573
28.8k
}
2574
2575
void cil_type_rule_init(struct cil_type_rule **type_rule)
2576
32.7k
{
2577
32.7k
  *type_rule = cil_malloc(sizeof(**type_rule));
2578
2579
32.7k
  (*type_rule)->rule_kind = CIL_NONE;
2580
32.7k
  (*type_rule)->src_str = NULL;
2581
32.7k
  (*type_rule)->src = NULL;
2582
32.7k
  (*type_rule)->tgt_str = NULL;
2583
32.7k
  (*type_rule)->tgt = NULL;
2584
32.7k
  (*type_rule)->obj_str = NULL;
2585
32.7k
  (*type_rule)->obj = NULL;
2586
32.7k
  (*type_rule)->result_str = NULL;
2587
32.7k
  (*type_rule)->result = NULL;
2588
32.7k
}
2589
2590
void cil_roletransition_init(struct cil_roletransition **role_trans)
2591
17.4k
{
2592
17.4k
  *role_trans = cil_malloc(sizeof(**role_trans));
2593
2594
17.4k
  (*role_trans)->src_str = NULL;
2595
17.4k
  (*role_trans)->src = NULL;
2596
17.4k
  (*role_trans)->tgt_str = NULL;
2597
17.4k
  (*role_trans)->tgt = NULL;
2598
17.4k
  (*role_trans)->obj_str = NULL;
2599
17.4k
  (*role_trans)->obj = NULL;
2600
17.4k
  (*role_trans)->result_str = NULL;
2601
17.4k
  (*role_trans)->result = NULL;
2602
17.4k
}
2603
2604
void cil_roleallow_init(struct cil_roleallow **roleallow)
2605
6.42k
{
2606
6.42k
  *roleallow = cil_malloc(sizeof(**roleallow));
2607
2608
6.42k
  (*roleallow)->src_str = NULL;
2609
6.42k
  (*roleallow)->src = NULL;
2610
6.42k
  (*roleallow)->tgt_str = NULL;
2611
6.42k
  (*roleallow)->tgt = NULL;
2612
6.42k
}
2613
2614
void cil_catset_init(struct cil_catset **catset)
2615
9.11k
{
2616
9.11k
  *catset = cil_malloc(sizeof(**catset));
2617
2618
9.11k
  cil_symtab_datum_init(&(*catset)->datum);
2619
9.11k
  (*catset)->cats = NULL;
2620
9.11k
}
2621
2622
void cil_senscat_init(struct cil_senscat **senscat)
2623
16.4k
{
2624
16.4k
  *senscat = cil_malloc(sizeof(**senscat));
2625
2626
16.4k
  (*senscat)->sens_str = NULL;
2627
16.4k
  (*senscat)->sens = NULL;
2628
16.4k
  (*senscat)->cats = NULL;
2629
16.4k
}
2630
2631
void cil_cats_init(struct cil_cats **cats)
2632
250k
{
2633
250k
  *cats = cil_malloc(sizeof(**cats));
2634
2635
250k
  (*cats)->evaluated = CIL_FALSE;
2636
250k
  (*cats)->str_expr = NULL;
2637
250k
  (*cats)->datum_expr = NULL;
2638
250k
}
2639
2640
void cil_filecon_init(struct cil_filecon **filecon)
2641
276k
{
2642
276k
  *filecon = cil_malloc(sizeof(**filecon));
2643
2644
276k
  (*filecon)->path_str = NULL;
2645
276k
  (*filecon)->type = CIL_FILECON_ANY;
2646
276k
  (*filecon)->context_str = NULL;
2647
276k
  (*filecon)->context = NULL;
2648
276k
}
2649
2650
void cil_ibpkeycon_init(struct cil_ibpkeycon **ibpkeycon)
2651
220k
{
2652
220k
  *ibpkeycon = cil_malloc(sizeof(**ibpkeycon));
2653
2654
220k
  (*ibpkeycon)->subnet_prefix_str = NULL;
2655
220k
  (*ibpkeycon)->pkey_low = 0;
2656
220k
  (*ibpkeycon)->pkey_high = 0;
2657
220k
  (*ibpkeycon)->context_str = NULL;
2658
220k
  (*ibpkeycon)->context = NULL;
2659
220k
}
2660
2661
void cil_portcon_init(struct cil_portcon **portcon)
2662
44.7k
{
2663
44.7k
  *portcon = cil_malloc(sizeof(**portcon));
2664
44.7k
  (*portcon)->proto = 0;
2665
44.7k
  (*portcon)->port_low = 0;
2666
44.7k
  (*portcon)->port_high = 0;
2667
44.7k
  (*portcon)->context_str = NULL;
2668
44.7k
  (*portcon)->context = NULL;
2669
44.7k
}
2670
2671
void cil_nodecon_init(struct cil_nodecon **nodecon)
2672
88.1k
{
2673
88.1k
  *nodecon = cil_malloc(sizeof(**nodecon));
2674
2675
88.1k
  (*nodecon)->addr_str = NULL;
2676
88.1k
  (*nodecon)->addr = NULL;
2677
88.1k
  (*nodecon)->mask_str = NULL;
2678
88.1k
  (*nodecon)->mask = NULL;
2679
88.1k
  (*nodecon)->context_str = NULL;
2680
88.1k
  (*nodecon)->context = NULL;
2681
88.1k
}
2682
2683
void cil_genfscon_init(struct cil_genfscon **genfscon)
2684
12.4k
{
2685
12.4k
  *genfscon = cil_malloc(sizeof(**genfscon));
2686
2687
12.4k
  (*genfscon)->fs_str = NULL;
2688
12.4k
  (*genfscon)->path_str = NULL;
2689
12.4k
  (*genfscon)->file_type = CIL_FILECON_ANY;
2690
12.4k
  (*genfscon)->context_str = NULL;
2691
12.4k
  (*genfscon)->context = NULL;
2692
12.4k
}
2693
2694
void cil_pirqcon_init(struct cil_pirqcon **pirqcon)
2695
19.6k
{
2696
19.6k
  *pirqcon = cil_malloc(sizeof(**pirqcon));
2697
  
2698
19.6k
  (*pirqcon)->pirq = 0;
2699
19.6k
  (*pirqcon)->context_str = NULL;
2700
19.6k
  (*pirqcon)->context = NULL;
2701
19.6k
}
2702
2703
void cil_iomemcon_init(struct cil_iomemcon **iomemcon)
2704
8.55k
{
2705
8.55k
  *iomemcon = cil_malloc(sizeof(**iomemcon));
2706
2707
8.55k
  (*iomemcon)->iomem_low = 0;
2708
8.55k
  (*iomemcon)->iomem_high = 0;
2709
8.55k
  (*iomemcon)->context_str = NULL;
2710
8.55k
  (*iomemcon)->context = NULL;
2711
8.55k
}
2712
2713
void cil_ioportcon_init(struct cil_ioportcon **ioportcon)
2714
137k
{
2715
137k
  *ioportcon = cil_malloc(sizeof(**ioportcon));
2716
2717
137k
  (*ioportcon)->context_str = NULL;
2718
137k
  (*ioportcon)->context = NULL;
2719
137k
}
2720
2721
void cil_pcidevicecon_init(struct cil_pcidevicecon **pcidevicecon)
2722
12.3k
{
2723
12.3k
  *pcidevicecon = cil_malloc(sizeof(**pcidevicecon));
2724
2725
12.3k
  (*pcidevicecon)->dev = 0;
2726
12.3k
  (*pcidevicecon)->context_str = NULL;
2727
12.3k
  (*pcidevicecon)->context = NULL;
2728
12.3k
}
2729
2730
void cil_devicetreecon_init(struct cil_devicetreecon **dtcon)
2731
30.9k
{
2732
30.9k
  *dtcon = cil_malloc(sizeof(**dtcon));
2733
2734
30.9k
  (*dtcon)->path = NULL;
2735
30.9k
  (*dtcon)->context_str = NULL;
2736
30.9k
  (*dtcon)->context = NULL;
2737
30.9k
}
2738
2739
void cil_fsuse_init(struct cil_fsuse **fsuse)
2740
59.3k
{
2741
59.3k
  *fsuse = cil_malloc(sizeof(**fsuse));
2742
2743
59.3k
  (*fsuse)->type = 0;
2744
59.3k
  (*fsuse)->fs_str = NULL;
2745
59.3k
  (*fsuse)->context_str = NULL;
2746
59.3k
  (*fsuse)->context = NULL;
2747
59.3k
}
2748
2749
void cil_constrain_init(struct cil_constrain **constrain)
2750
74.5k
{
2751
74.5k
  *constrain = cil_malloc(sizeof(**constrain));
2752
2753
74.5k
  (*constrain)->classperms = NULL;
2754
74.5k
  (*constrain)->str_expr = NULL;
2755
74.5k
  (*constrain)->datum_expr = NULL;
2756
74.5k
}
2757
2758
void cil_validatetrans_init(struct cil_validatetrans **validtrans)
2759
82.8k
{
2760
82.8k
  *validtrans = cil_malloc(sizeof(**validtrans));
2761
2762
82.8k
  (*validtrans)->class_str = NULL;
2763
82.8k
  (*validtrans)->class = NULL;
2764
82.8k
  (*validtrans)->str_expr = NULL;
2765
82.8k
  (*validtrans)->datum_expr = NULL;
2766
82.8k
}
2767
2768
void cil_ipaddr_init(struct cil_ipaddr **ipaddr)
2769
19.4k
{
2770
19.4k
  *ipaddr = cil_malloc(sizeof(**ipaddr));
2771
2772
19.4k
  cil_symtab_datum_init(&(*ipaddr)->datum);
2773
19.4k
  memset(&(*ipaddr)->ip, 0, sizeof((*ipaddr)->ip));
2774
19.4k
}
2775
2776
void cil_perm_init(struct cil_perm **perm)
2777
114k
{
2778
114k
  *perm = cil_malloc(sizeof(**perm));
2779
2780
114k
  cil_symtab_datum_init(&(*perm)->datum);
2781
114k
  (*perm)->value = 0;
2782
114k
  (*perm)->classperms = NULL;
2783
114k
}
2784
2785
void cil_classpermission_init(struct cil_classpermission **cp)
2786
14.0k
{
2787
14.0k
  *cp = cil_malloc(sizeof(**cp));
2788
2789
14.0k
  cil_symtab_datum_init(&(*cp)->datum);
2790
14.0k
  (*cp)->classperms = NULL;
2791
14.0k
}
2792
2793
void cil_classpermissionset_init(struct cil_classpermissionset **cps)
2794
7.10k
{
2795
7.10k
  *cps = cil_malloc(sizeof(**cps));
2796
2797
7.10k
  (*cps)->set_str = NULL;
2798
7.10k
  (*cps)->set = NULL;
2799
7.10k
  (*cps)->classperms = NULL;
2800
7.10k
}
2801
2802
void cil_classperms_set_init(struct cil_classperms_set **cp_set)
2803
65.0k
{
2804
65.0k
  *cp_set = cil_malloc(sizeof(**cp_set));
2805
65.0k
  (*cp_set)->set_str = NULL;
2806
65.0k
  (*cp_set)->set = NULL;
2807
65.0k
}
2808
2809
void cil_classperms_init(struct cil_classperms **cp)
2810
1.10M
{
2811
1.10M
  *cp = cil_malloc(sizeof(**cp));
2812
1.10M
  (*cp)->class_str = NULL;
2813
1.10M
  (*cp)->class = NULL;
2814
1.10M
  (*cp)->perm_strs = NULL;
2815
1.10M
  (*cp)->perms = NULL;
2816
1.10M
}
2817
2818
void cil_classmapping_init(struct cil_classmapping **mapping)
2819
40.0k
{
2820
40.0k
  *mapping = cil_malloc(sizeof(**mapping));
2821
2822
40.0k
  (*mapping)->map_class_str = NULL;
2823
40.0k
  (*mapping)->map_class = NULL;
2824
40.0k
  (*mapping)->map_perm_str = NULL;
2825
40.0k
  (*mapping)->map_perm = NULL;
2826
40.0k
  (*mapping)->classperms = NULL;
2827
40.0k
}
2828
2829
void cil_user_init(struct cil_user **user)
2830
18.7k
{
2831
18.7k
  *user = cil_malloc(sizeof(**user));
2832
2833
18.7k
  cil_symtab_datum_init(&(*user)->datum);
2834
18.7k
  (*user)->bounds = NULL;
2835
18.7k
  (*user)->roles = NULL;
2836
18.7k
  (*user)->dftlevel = NULL;
2837
18.7k
  (*user)->range = NULL;
2838
18.7k
  (*user)->value = 0;
2839
18.7k
}
2840
2841
void cil_userattribute_init(struct cil_userattribute **attr)
2842
23.9k
{
2843
23.9k
  *attr = cil_malloc(sizeof(**attr));
2844
2845
23.9k
  cil_symtab_datum_init(&(*attr)->datum);
2846
2847
23.9k
  (*attr)->expr_list = NULL;
2848
23.9k
  (*attr)->users = NULL;
2849
23.9k
}
2850
2851
void cil_userattributeset_init(struct cil_userattributeset **attrset)
2852
24.5k
{
2853
24.5k
  *attrset = cil_malloc(sizeof(**attrset));
2854
2855
24.5k
  (*attrset)->attr_str = NULL;
2856
24.5k
  (*attrset)->attr = NULL;
2857
24.5k
  (*attrset)->str_expr = NULL;
2858
24.5k
  (*attrset)->datum_expr = NULL;
2859
24.5k
}
2860
2861
void cil_userlevel_init(struct cil_userlevel **usrlvl)
2862
25.2k
{
2863
25.2k
  *usrlvl = cil_malloc(sizeof(**usrlvl));
2864
2865
25.2k
  (*usrlvl)->user_str = NULL;
2866
25.2k
  (*usrlvl)->user = NULL;
2867
25.2k
  (*usrlvl)->level_str = NULL;
2868
25.2k
  (*usrlvl)->level = NULL;
2869
25.2k
}
2870
2871
void cil_userrange_init(struct cil_userrange **userrange)
2872
42.0k
{
2873
42.0k
  *userrange = cil_malloc(sizeof(**userrange));
2874
2875
42.0k
  (*userrange)->user_str = NULL;
2876
42.0k
  (*userrange)->user = NULL;
2877
42.0k
  (*userrange)->range_str = NULL;
2878
42.0k
  (*userrange)->range = NULL;
2879
42.0k
}
2880
2881
void cil_role_init(struct cil_role **role)
2882
42.3k
{
2883
42.3k
  *role = cil_malloc(sizeof(**role));
2884
2885
42.3k
  cil_symtab_datum_init(&(*role)->datum);
2886
42.3k
  (*role)->bounds = NULL;
2887
42.3k
  (*role)->types = NULL;
2888
42.3k
  (*role)->value = 0;
2889
42.3k
}
2890
2891
void cil_type_init(struct cil_type **type)
2892
640k
{
2893
640k
  *type = cil_malloc(sizeof(**type));
2894
2895
640k
  cil_symtab_datum_init(&(*type)->datum);
2896
640k
  (*type)->bounds = NULL;
2897
640k
  (*type)->value = 0;
2898
640k
}
2899
2900
void cil_cat_init(struct cil_cat **cat)
2901
8.63k
{
2902
8.63k
  *cat = cil_malloc(sizeof(**cat));
2903
2904
8.63k
  cil_symtab_datum_init(&(*cat)->datum);
2905
8.63k
  (*cat)->ordered = CIL_FALSE;
2906
8.63k
  (*cat)->value = 0;
2907
8.63k
}
2908
2909
void cil_args_init(struct cil_args **args)
2910
60.7k
{
2911
60.7k
  *args = cil_malloc(sizeof(**args));
2912
60.7k
  (*args)->arg_str = NULL;
2913
60.7k
  (*args)->arg = NULL;
2914
60.7k
  (*args)->param_str = NULL;
2915
60.7k
  (*args)->flavor = CIL_NONE;
2916
60.7k
}
2917
2918
void cil_call_init(struct cil_call **call)
2919
108k
{
2920
108k
  *call = cil_malloc(sizeof(**call));
2921
2922
108k
  (*call)->macro_str = NULL;
2923
108k
  (*call)->macro = NULL;
2924
108k
  (*call)->args_tree = NULL;
2925
108k
  (*call)->args = NULL;
2926
108k
  (*call)->copied = 0;
2927
108k
}
2928
2929
void cil_optional_init(struct cil_optional **optional)
2930
374k
{
2931
374k
  *optional = cil_malloc(sizeof(**optional));
2932
374k
  cil_symtab_datum_init(&(*optional)->datum);
2933
374k
}
2934
2935
void cil_param_init(struct cil_param **param)
2936
18.0k
{
2937
18.0k
  *param = cil_malloc(sizeof(**param));
2938
2939
18.0k
  (*param)->str = NULL;
2940
18.0k
  (*param)->flavor = CIL_NONE;
2941
18.0k
}
2942
2943
void cil_macro_init(struct cil_macro **macro)
2944
21.7k
{
2945
21.7k
  *macro = cil_malloc(sizeof(**macro));
2946
2947
21.7k
  cil_symtab_datum_init(&(*macro)->datum);
2948
21.7k
  cil_symtab_array_init((*macro)->symtab, cil_sym_sizes[CIL_SYM_ARRAY_MACRO]);
2949
21.7k
  (*macro)->params = NULL;
2950
21.7k
}
2951
2952
void cil_policycap_init(struct cil_policycap **policycap)
2953
6.71k
{
2954
6.71k
  *policycap = cil_malloc(sizeof(**policycap));
2955
2956
6.71k
  cil_symtab_datum_init(&(*policycap)->datum);
2957
6.71k
}
2958
2959
void cil_bounds_init(struct cil_bounds **bounds)
2960
21.4k
{
2961
21.4k
  *bounds = cil_malloc(sizeof(**bounds));
2962
2963
21.4k
  (*bounds)->parent_str = NULL;
2964
21.4k
  (*bounds)->parent = NULL;
2965
21.4k
  (*bounds)->child_str = NULL;
2966
21.4k
  (*bounds)->child = NULL;
2967
21.4k
}
2968
2969
void cil_default_init(struct cil_default **def)
2970
81.2k
{
2971
81.2k
  *def = cil_malloc(sizeof(**def));
2972
2973
81.2k
  (*def)->flavor = CIL_NONE;
2974
81.2k
  (*def)->class_strs = NULL;
2975
81.2k
  (*def)->class_datums = NULL;
2976
81.2k
}
2977
2978
void cil_defaultrange_init(struct cil_defaultrange **def)
2979
29.6k
{
2980
29.6k
  *def = cil_malloc(sizeof(**def));
2981
2982
29.6k
  (*def)->class_strs = NULL;
2983
29.6k
  (*def)->class_datums = NULL;
2984
29.6k
}
2985
2986
void cil_handleunknown_init(struct cil_handleunknown **unk)
2987
2.79k
{
2988
2.79k
  *unk = cil_malloc(sizeof(**unk));
2989
2.79k
}
2990
2991
void cil_mls_init(struct cil_mls **mls)
2992
4.72k
{
2993
4.72k
  *mls = cil_malloc(sizeof(**mls));
2994
4.72k
  (*mls)->value = 0;
2995
4.72k
}
2996
2997
void cil_src_info_init(struct cil_src_info **info)
2998
15.6k
{
2999
15.6k
  *info = cil_malloc(sizeof(**info));
3000
15.6k
  (*info)->kind = NULL;
3001
15.6k
  (*info)->hll_line = 0;
3002
  (*info)->path = NULL;
3003
15.6k
}