Coverage Report

Created: 2023-11-19 06:21

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