xref: /aosp_15_r20/external/selinux/libsepol/cil/src/cil_symtab.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker /*
2*2d543d20SAndroid Build Coastguard Worker  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
3*2d543d20SAndroid Build Coastguard Worker  *
4*2d543d20SAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
5*2d543d20SAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions are met:
6*2d543d20SAndroid Build Coastguard Worker  *
7*2d543d20SAndroid Build Coastguard Worker  *    1. Redistributions of source code must retain the above copyright notice,
8*2d543d20SAndroid Build Coastguard Worker  *       this list of conditions and the following disclaimer.
9*2d543d20SAndroid Build Coastguard Worker  *
10*2d543d20SAndroid Build Coastguard Worker  *    2. Redistributions in binary form must reproduce the above copyright notice,
11*2d543d20SAndroid Build Coastguard Worker  *       this list of conditions and the following disclaimer in the documentation
12*2d543d20SAndroid Build Coastguard Worker  *       and/or other materials provided with the distribution.
13*2d543d20SAndroid Build Coastguard Worker  *
14*2d543d20SAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
15*2d543d20SAndroid Build Coastguard Worker  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16*2d543d20SAndroid Build Coastguard Worker  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
17*2d543d20SAndroid Build Coastguard Worker  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18*2d543d20SAndroid Build Coastguard Worker  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19*2d543d20SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20*2d543d20SAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21*2d543d20SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
22*2d543d20SAndroid Build Coastguard Worker  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
23*2d543d20SAndroid Build Coastguard Worker  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24*2d543d20SAndroid Build Coastguard Worker  *
25*2d543d20SAndroid Build Coastguard Worker  * The views and conclusions contained in the software and documentation are those
26*2d543d20SAndroid Build Coastguard Worker  * of the authors and should not be interpreted as representing official policies,
27*2d543d20SAndroid Build Coastguard Worker  * either expressed or implied, of Tresys Technology, LLC.
28*2d543d20SAndroid Build Coastguard Worker  */
29*2d543d20SAndroid Build Coastguard Worker 
30*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
31*2d543d20SAndroid Build Coastguard Worker #include <string.h>
32*2d543d20SAndroid Build Coastguard Worker #include <stdarg.h>
33*2d543d20SAndroid Build Coastguard Worker 
34*2d543d20SAndroid Build Coastguard Worker #include <sepol/errcodes.h>
35*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/hashtab.h>
36*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/symtab.h>
37*2d543d20SAndroid Build Coastguard Worker 
38*2d543d20SAndroid Build Coastguard Worker #include "cil_internal.h"
39*2d543d20SAndroid Build Coastguard Worker #include "cil_tree.h"
40*2d543d20SAndroid Build Coastguard Worker #include "cil_symtab.h"
41*2d543d20SAndroid Build Coastguard Worker #include "cil_mem.h"
42*2d543d20SAndroid Build Coastguard Worker #include "cil_strpool.h"
43*2d543d20SAndroid Build Coastguard Worker #include "cil_log.h"
44*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_error(const char * msg,...)45*2d543d20SAndroid Build Coastguard Worker __attribute__((noreturn)) __attribute__((format (printf, 1, 2))) static void cil_symtab_error(const char* msg, ...)
46*2d543d20SAndroid Build Coastguard Worker {
47*2d543d20SAndroid Build Coastguard Worker 	va_list ap;
48*2d543d20SAndroid Build Coastguard Worker 	va_start(ap, msg);
49*2d543d20SAndroid Build Coastguard Worker 	cil_vlog(CIL_ERR, msg, ap);
50*2d543d20SAndroid Build Coastguard Worker 	va_end(ap);
51*2d543d20SAndroid Build Coastguard Worker 	exit(1);
52*2d543d20SAndroid Build Coastguard Worker }
53*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_init(symtab_t * symtab,unsigned int size)54*2d543d20SAndroid Build Coastguard Worker void cil_symtab_init(symtab_t *symtab, unsigned int size)
55*2d543d20SAndroid Build Coastguard Worker {
56*2d543d20SAndroid Build Coastguard Worker 	int rc = symtab_init(symtab, size);
57*2d543d20SAndroid Build Coastguard Worker 	if (rc != SEPOL_OK) {
58*2d543d20SAndroid Build Coastguard Worker 		cil_symtab_error("Failed to create symtab\n");
59*2d543d20SAndroid Build Coastguard Worker 	}
60*2d543d20SAndroid Build Coastguard Worker }
61*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_datum_init(struct cil_symtab_datum * datum)62*2d543d20SAndroid Build Coastguard Worker void cil_symtab_datum_init(struct cil_symtab_datum *datum)
63*2d543d20SAndroid Build Coastguard Worker {
64*2d543d20SAndroid Build Coastguard Worker 	datum->name = NULL;
65*2d543d20SAndroid Build Coastguard Worker 	datum->fqn = NULL;
66*2d543d20SAndroid Build Coastguard Worker 	datum->symtab = NULL;
67*2d543d20SAndroid Build Coastguard Worker 	cil_list_init(&datum->nodes, CIL_LIST_ITEM);
68*2d543d20SAndroid Build Coastguard Worker }
69*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_datum_destroy(struct cil_symtab_datum * datum)70*2d543d20SAndroid Build Coastguard Worker void cil_symtab_datum_destroy(struct cil_symtab_datum *datum)
71*2d543d20SAndroid Build Coastguard Worker {
72*2d543d20SAndroid Build Coastguard Worker 	cil_list_destroy(&datum->nodes, 0);
73*2d543d20SAndroid Build Coastguard Worker 	cil_symtab_remove_datum(datum);
74*2d543d20SAndroid Build Coastguard Worker }
75*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_datum_remove_node(struct cil_symtab_datum * datum,struct cil_tree_node * node)76*2d543d20SAndroid Build Coastguard Worker void cil_symtab_datum_remove_node(struct cil_symtab_datum *datum, struct cil_tree_node *node)
77*2d543d20SAndroid Build Coastguard Worker {
78*2d543d20SAndroid Build Coastguard Worker 	if (datum && datum->nodes != NULL) {
79*2d543d20SAndroid Build Coastguard Worker 		cil_list_remove(datum->nodes, CIL_NODE, node, 0);
80*2d543d20SAndroid Build Coastguard Worker 		if (datum->nodes->head == NULL) {
81*2d543d20SAndroid Build Coastguard Worker 			cil_symtab_datum_destroy(datum);
82*2d543d20SAndroid Build Coastguard Worker 		}
83*2d543d20SAndroid Build Coastguard Worker 	}
84*2d543d20SAndroid Build Coastguard Worker }
85*2d543d20SAndroid Build Coastguard Worker 
86*2d543d20SAndroid Build Coastguard Worker /* This both initializes the datum and inserts it into the symtab.
87*2d543d20SAndroid Build Coastguard Worker    Note that cil_symtab_datum_destroy() is the analog to the initializer portion */
cil_symtab_insert(symtab_t * symtab,hashtab_key_t key,struct cil_symtab_datum * datum,struct cil_tree_node * node)88*2d543d20SAndroid Build Coastguard Worker int cil_symtab_insert(symtab_t *symtab, hashtab_key_t key, struct cil_symtab_datum *datum, struct cil_tree_node *node)
89*2d543d20SAndroid Build Coastguard Worker {
90*2d543d20SAndroid Build Coastguard Worker 	int rc = hashtab_insert(symtab->table, key, (hashtab_datum_t)datum);
91*2d543d20SAndroid Build Coastguard Worker 	if (rc == SEPOL_OK) {
92*2d543d20SAndroid Build Coastguard Worker 		datum->name = key;
93*2d543d20SAndroid Build Coastguard Worker 		datum->fqn = key;
94*2d543d20SAndroid Build Coastguard Worker 		datum->symtab = symtab;
95*2d543d20SAndroid Build Coastguard Worker 		symtab->nprim++;
96*2d543d20SAndroid Build Coastguard Worker 		if (node) {
97*2d543d20SAndroid Build Coastguard Worker 			cil_list_append(datum->nodes, CIL_NODE, node);
98*2d543d20SAndroid Build Coastguard Worker 		}
99*2d543d20SAndroid Build Coastguard Worker 	} else if (rc != SEPOL_EEXIST) {
100*2d543d20SAndroid Build Coastguard Worker 		cil_symtab_error("Failed to insert datum into hashtab\n");
101*2d543d20SAndroid Build Coastguard Worker 	}
102*2d543d20SAndroid Build Coastguard Worker 
103*2d543d20SAndroid Build Coastguard Worker 	return rc;
104*2d543d20SAndroid Build Coastguard Worker }
105*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_remove_datum(struct cil_symtab_datum * datum)106*2d543d20SAndroid Build Coastguard Worker void cil_symtab_remove_datum(struct cil_symtab_datum *datum)
107*2d543d20SAndroid Build Coastguard Worker {
108*2d543d20SAndroid Build Coastguard Worker 	symtab_t *symtab = datum->symtab;
109*2d543d20SAndroid Build Coastguard Worker 
110*2d543d20SAndroid Build Coastguard Worker 	if (symtab == NULL) {
111*2d543d20SAndroid Build Coastguard Worker 		return;
112*2d543d20SAndroid Build Coastguard Worker 	}
113*2d543d20SAndroid Build Coastguard Worker 
114*2d543d20SAndroid Build Coastguard Worker 	hashtab_remove(symtab->table, datum->name, NULL, NULL);
115*2d543d20SAndroid Build Coastguard Worker 	symtab->nprim--;
116*2d543d20SAndroid Build Coastguard Worker 	datum->symtab = NULL;
117*2d543d20SAndroid Build Coastguard Worker }
118*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_get_datum(symtab_t * symtab,char * key,struct cil_symtab_datum ** datum)119*2d543d20SAndroid Build Coastguard Worker int cil_symtab_get_datum(symtab_t *symtab, char *key, struct cil_symtab_datum **datum)
120*2d543d20SAndroid Build Coastguard Worker {
121*2d543d20SAndroid Build Coastguard Worker 	*datum = (struct cil_symtab_datum*)hashtab_search(symtab->table, (hashtab_key_t)key);
122*2d543d20SAndroid Build Coastguard Worker 	if (*datum == NULL) {
123*2d543d20SAndroid Build Coastguard Worker 		return SEPOL_ENOENT;
124*2d543d20SAndroid Build Coastguard Worker 	}
125*2d543d20SAndroid Build Coastguard Worker 
126*2d543d20SAndroid Build Coastguard Worker 	return SEPOL_OK;
127*2d543d20SAndroid Build Coastguard Worker }
128*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_map(symtab_t * symtab,int (* apply)(hashtab_key_t k,hashtab_datum_t d,void * args),void * args)129*2d543d20SAndroid Build Coastguard Worker int cil_symtab_map(symtab_t *symtab,
130*2d543d20SAndroid Build Coastguard Worker 				   int (*apply) (hashtab_key_t k, hashtab_datum_t d, void *args),
131*2d543d20SAndroid Build Coastguard Worker 				   void *args)
132*2d543d20SAndroid Build Coastguard Worker {
133*2d543d20SAndroid Build Coastguard Worker 	return hashtab_map(symtab->table, apply, args);
134*2d543d20SAndroid Build Coastguard Worker }
135*2d543d20SAndroid Build Coastguard Worker 
__cil_symtab_destroy_helper(hashtab_key_t k,hashtab_datum_t d,void * args)136*2d543d20SAndroid Build Coastguard Worker static int __cil_symtab_destroy_helper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, __attribute__((unused)) void *args)
137*2d543d20SAndroid Build Coastguard Worker {
138*2d543d20SAndroid Build Coastguard Worker 	struct cil_symtab_datum *datum = d;
139*2d543d20SAndroid Build Coastguard Worker 	datum->symtab = NULL;
140*2d543d20SAndroid Build Coastguard Worker 	return SEPOL_OK;
141*2d543d20SAndroid Build Coastguard Worker }
142*2d543d20SAndroid Build Coastguard Worker 
cil_symtab_destroy(symtab_t * symtab)143*2d543d20SAndroid Build Coastguard Worker void cil_symtab_destroy(symtab_t *symtab)
144*2d543d20SAndroid Build Coastguard Worker {
145*2d543d20SAndroid Build Coastguard Worker 	if (symtab->table != NULL){
146*2d543d20SAndroid Build Coastguard Worker 		cil_symtab_map(symtab, __cil_symtab_destroy_helper, NULL);
147*2d543d20SAndroid Build Coastguard Worker 		hashtab_destroy(symtab->table);
148*2d543d20SAndroid Build Coastguard Worker 		symtab->table = NULL;
149*2d543d20SAndroid Build Coastguard Worker 	}
150*2d543d20SAndroid Build Coastguard Worker }
151*2d543d20SAndroid Build Coastguard Worker 
cil_complex_symtab_hash(struct cil_complex_symtab_key * ckey,int mask,intptr_t * hash)152*2d543d20SAndroid Build Coastguard Worker static void cil_complex_symtab_hash(struct cil_complex_symtab_key *ckey, int mask, intptr_t *hash)
153*2d543d20SAndroid Build Coastguard Worker {
154*2d543d20SAndroid Build Coastguard Worker 	intptr_t sum = ckey->key1 + ckey->key2 + ckey->key3 + ckey->key4;
155*2d543d20SAndroid Build Coastguard Worker 	*hash = (intptr_t)((sum >> 2) & mask);
156*2d543d20SAndroid Build Coastguard Worker }
157*2d543d20SAndroid Build Coastguard Worker 
cil_complex_symtab_init(struct cil_complex_symtab * symtab,unsigned int size)158*2d543d20SAndroid Build Coastguard Worker void cil_complex_symtab_init(struct cil_complex_symtab *symtab, unsigned int size)
159*2d543d20SAndroid Build Coastguard Worker {
160*2d543d20SAndroid Build Coastguard Worker 	symtab->htable = cil_calloc(size, sizeof(struct cil_complex_symtab *));
161*2d543d20SAndroid Build Coastguard Worker 
162*2d543d20SAndroid Build Coastguard Worker 	symtab->nelems = 0;
163*2d543d20SAndroid Build Coastguard Worker 	symtab->nslots = size;
164*2d543d20SAndroid Build Coastguard Worker 	symtab->mask = size - 1;
165*2d543d20SAndroid Build Coastguard Worker }
166*2d543d20SAndroid Build Coastguard Worker 
cil_complex_symtab_insert(struct cil_complex_symtab * symtab,struct cil_complex_symtab_key * ckey,struct cil_complex_symtab_datum * datum)167*2d543d20SAndroid Build Coastguard Worker int cil_complex_symtab_insert(struct cil_complex_symtab *symtab,
168*2d543d20SAndroid Build Coastguard Worker 			struct cil_complex_symtab_key *ckey,
169*2d543d20SAndroid Build Coastguard Worker 			struct cil_complex_symtab_datum *datum)
170*2d543d20SAndroid Build Coastguard Worker {
171*2d543d20SAndroid Build Coastguard Worker 	intptr_t hash;
172*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *node = NULL;
173*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *prev = NULL;
174*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *curr = NULL;
175*2d543d20SAndroid Build Coastguard Worker 
176*2d543d20SAndroid Build Coastguard Worker 	node = cil_malloc(sizeof(*node));
177*2d543d20SAndroid Build Coastguard Worker 	memset(node, 0, sizeof(*node));
178*2d543d20SAndroid Build Coastguard Worker 
179*2d543d20SAndroid Build Coastguard Worker 	node->ckey = ckey;
180*2d543d20SAndroid Build Coastguard Worker 	node->datum = datum;
181*2d543d20SAndroid Build Coastguard Worker 
182*2d543d20SAndroid Build Coastguard Worker 	cil_complex_symtab_hash(ckey, symtab->mask, &hash);
183*2d543d20SAndroid Build Coastguard Worker 
184*2d543d20SAndroid Build Coastguard Worker 	for (prev = NULL, curr = symtab->htable[hash]; curr != NULL;
185*2d543d20SAndroid Build Coastguard Worker 		prev = curr, curr = curr->next) {
186*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
187*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
188*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 == curr->ckey->key3 &&
189*2d543d20SAndroid Build Coastguard Worker 			ckey->key4 == curr->ckey->key4) {
190*2d543d20SAndroid Build Coastguard Worker 			free(node);
191*2d543d20SAndroid Build Coastguard Worker 			return SEPOL_EEXIST;
192*2d543d20SAndroid Build Coastguard Worker 		}
193*2d543d20SAndroid Build Coastguard Worker 
194*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
195*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 < curr->ckey->key2) {
196*2d543d20SAndroid Build Coastguard Worker 			break;
197*2d543d20SAndroid Build Coastguard Worker 		}
198*2d543d20SAndroid Build Coastguard Worker 
199*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
200*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
201*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 < curr->ckey->key3) {
202*2d543d20SAndroid Build Coastguard Worker 			break;
203*2d543d20SAndroid Build Coastguard Worker 		}
204*2d543d20SAndroid Build Coastguard Worker 
205*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
206*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
207*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 == curr->ckey->key3 &&
208*2d543d20SAndroid Build Coastguard Worker 			ckey->key4 < curr->ckey->key4) {
209*2d543d20SAndroid Build Coastguard Worker 			break;
210*2d543d20SAndroid Build Coastguard Worker 		}
211*2d543d20SAndroid Build Coastguard Worker 	}
212*2d543d20SAndroid Build Coastguard Worker 
213*2d543d20SAndroid Build Coastguard Worker 	if (prev != NULL) {
214*2d543d20SAndroid Build Coastguard Worker 		node->next = prev->next;
215*2d543d20SAndroid Build Coastguard Worker 		prev->next = node;
216*2d543d20SAndroid Build Coastguard Worker 	} else {
217*2d543d20SAndroid Build Coastguard Worker 		node->next = symtab->htable[hash];
218*2d543d20SAndroid Build Coastguard Worker 		symtab->htable[hash] = node;
219*2d543d20SAndroid Build Coastguard Worker 	}
220*2d543d20SAndroid Build Coastguard Worker 
221*2d543d20SAndroid Build Coastguard Worker 	symtab->nelems++;
222*2d543d20SAndroid Build Coastguard Worker 
223*2d543d20SAndroid Build Coastguard Worker 	return SEPOL_OK;
224*2d543d20SAndroid Build Coastguard Worker }
225*2d543d20SAndroid Build Coastguard Worker 
cil_complex_symtab_search(struct cil_complex_symtab * symtab,struct cil_complex_symtab_key * ckey,struct cil_complex_symtab_datum ** out)226*2d543d20SAndroid Build Coastguard Worker void cil_complex_symtab_search(struct cil_complex_symtab *symtab,
227*2d543d20SAndroid Build Coastguard Worker 			       struct cil_complex_symtab_key *ckey,
228*2d543d20SAndroid Build Coastguard Worker 			       struct cil_complex_symtab_datum **out)
229*2d543d20SAndroid Build Coastguard Worker {
230*2d543d20SAndroid Build Coastguard Worker 	intptr_t hash;
231*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *curr = NULL;
232*2d543d20SAndroid Build Coastguard Worker 
233*2d543d20SAndroid Build Coastguard Worker 	cil_complex_symtab_hash(ckey, symtab->mask, &hash);
234*2d543d20SAndroid Build Coastguard Worker 	for (curr = symtab->htable[hash]; curr != NULL; curr = curr->next) {
235*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
236*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
237*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 == curr->ckey->key3 &&
238*2d543d20SAndroid Build Coastguard Worker 			ckey->key4 == curr->ckey->key4) {
239*2d543d20SAndroid Build Coastguard Worker 			*out = curr->datum;
240*2d543d20SAndroid Build Coastguard Worker 			return;
241*2d543d20SAndroid Build Coastguard Worker 		}
242*2d543d20SAndroid Build Coastguard Worker 
243*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
244*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 < curr->ckey->key2) {
245*2d543d20SAndroid Build Coastguard Worker 			break;
246*2d543d20SAndroid Build Coastguard Worker 		}
247*2d543d20SAndroid Build Coastguard Worker 
248*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
249*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
250*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 < curr->ckey->key3) {
251*2d543d20SAndroid Build Coastguard Worker 			break;
252*2d543d20SAndroid Build Coastguard Worker 		}
253*2d543d20SAndroid Build Coastguard Worker 
254*2d543d20SAndroid Build Coastguard Worker 		if (ckey->key1 == curr->ckey->key1 &&
255*2d543d20SAndroid Build Coastguard Worker 			ckey->key2 == curr->ckey->key2 &&
256*2d543d20SAndroid Build Coastguard Worker 			ckey->key3 == curr->ckey->key3 &&
257*2d543d20SAndroid Build Coastguard Worker 			ckey->key4 < curr->ckey->key4) {
258*2d543d20SAndroid Build Coastguard Worker 			break;
259*2d543d20SAndroid Build Coastguard Worker 		}
260*2d543d20SAndroid Build Coastguard Worker 	}
261*2d543d20SAndroid Build Coastguard Worker 
262*2d543d20SAndroid Build Coastguard Worker 	*out = NULL;
263*2d543d20SAndroid Build Coastguard Worker }
264*2d543d20SAndroid Build Coastguard Worker 
cil_complex_symtab_destroy(struct cil_complex_symtab * symtab)265*2d543d20SAndroid Build Coastguard Worker void cil_complex_symtab_destroy(struct cil_complex_symtab *symtab)
266*2d543d20SAndroid Build Coastguard Worker {
267*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *curr = NULL;
268*2d543d20SAndroid Build Coastguard Worker 	struct cil_complex_symtab_node *temp = NULL;
269*2d543d20SAndroid Build Coastguard Worker 	unsigned int i;
270*2d543d20SAndroid Build Coastguard Worker 
271*2d543d20SAndroid Build Coastguard Worker 	if (symtab == NULL) {
272*2d543d20SAndroid Build Coastguard Worker 		return;
273*2d543d20SAndroid Build Coastguard Worker 	}
274*2d543d20SAndroid Build Coastguard Worker 
275*2d543d20SAndroid Build Coastguard Worker 	for (i = 0; i < symtab->nslots; i++) {
276*2d543d20SAndroid Build Coastguard Worker 		curr = symtab->htable[i];
277*2d543d20SAndroid Build Coastguard Worker 		while (curr != NULL) {
278*2d543d20SAndroid Build Coastguard Worker 			temp = curr;
279*2d543d20SAndroid Build Coastguard Worker 			curr = curr->next;
280*2d543d20SAndroid Build Coastguard Worker 			free(temp);
281*2d543d20SAndroid Build Coastguard Worker 		}
282*2d543d20SAndroid Build Coastguard Worker 		symtab->htable[i] = NULL;
283*2d543d20SAndroid Build Coastguard Worker 	}
284*2d543d20SAndroid Build Coastguard Worker 	free(symtab->htable);
285*2d543d20SAndroid Build Coastguard Worker 	symtab->htable = NULL;
286*2d543d20SAndroid Build Coastguard Worker 	symtab->nelems = 0;
287*2d543d20SAndroid Build Coastguard Worker 	symtab->nslots = 0;
288*2d543d20SAndroid Build Coastguard Worker 	symtab->mask = 0;
289*2d543d20SAndroid Build Coastguard Worker }
290