xref: /aosp_15_r20/external/selinux/libsepol/src/symtab.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker 
2*2d543d20SAndroid Build Coastguard Worker /* Author : Stephen Smalley, <[email protected]> */
3*2d543d20SAndroid Build Coastguard Worker 
4*2d543d20SAndroid Build Coastguard Worker /* FLASK */
5*2d543d20SAndroid Build Coastguard Worker 
6*2d543d20SAndroid Build Coastguard Worker /*
7*2d543d20SAndroid Build Coastguard Worker  * Implementation of the symbol table type.
8*2d543d20SAndroid Build Coastguard Worker  */
9*2d543d20SAndroid Build Coastguard Worker 
10*2d543d20SAndroid Build Coastguard Worker #include <string.h>
11*2d543d20SAndroid Build Coastguard Worker 
12*2d543d20SAndroid Build Coastguard Worker #include "private.h"
13*2d543d20SAndroid Build Coastguard Worker 
14*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/hashtab.h>
15*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb/symtab.h>
16*2d543d20SAndroid Build Coastguard Worker 
17*2d543d20SAndroid Build Coastguard Worker ignore_unsigned_overflow_
symhash(hashtab_t h,const_hashtab_key_t key)18*2d543d20SAndroid Build Coastguard Worker static unsigned int symhash(hashtab_t h, const_hashtab_key_t key)
19*2d543d20SAndroid Build Coastguard Worker {
20*2d543d20SAndroid Build Coastguard Worker 	unsigned int hash = 5381;
21*2d543d20SAndroid Build Coastguard Worker 	unsigned char c;
22*2d543d20SAndroid Build Coastguard Worker 
23*2d543d20SAndroid Build Coastguard Worker 	while ((c = *(unsigned const char *)key++))
24*2d543d20SAndroid Build Coastguard Worker 		hash = ((hash << 5) + hash) ^ c;
25*2d543d20SAndroid Build Coastguard Worker 
26*2d543d20SAndroid Build Coastguard Worker 	return hash & (h->size - 1);
27*2d543d20SAndroid Build Coastguard Worker }
28*2d543d20SAndroid Build Coastguard Worker 
symcmp(hashtab_t h,const_hashtab_key_t key1,const_hashtab_key_t key2)29*2d543d20SAndroid Build Coastguard Worker static int symcmp(hashtab_t h
30*2d543d20SAndroid Build Coastguard Worker 		  __attribute__ ((unused)), const_hashtab_key_t key1,
31*2d543d20SAndroid Build Coastguard Worker 		  const_hashtab_key_t key2)
32*2d543d20SAndroid Build Coastguard Worker {
33*2d543d20SAndroid Build Coastguard Worker 	return strcmp(key1, key2);
34*2d543d20SAndroid Build Coastguard Worker }
35*2d543d20SAndroid Build Coastguard Worker 
symtab_init(symtab_t * s,unsigned int size)36*2d543d20SAndroid Build Coastguard Worker int symtab_init(symtab_t * s, unsigned int size)
37*2d543d20SAndroid Build Coastguard Worker {
38*2d543d20SAndroid Build Coastguard Worker 	s->table = hashtab_create(symhash, symcmp, size);
39*2d543d20SAndroid Build Coastguard Worker 	if (!s->table)
40*2d543d20SAndroid Build Coastguard Worker 		return -1;
41*2d543d20SAndroid Build Coastguard Worker 	s->nprim = 0;
42*2d543d20SAndroid Build Coastguard Worker 	return 0;
43*2d543d20SAndroid Build Coastguard Worker }
44*2d543d20SAndroid Build Coastguard Worker 
symtab_destroy(symtab_t * s)45*2d543d20SAndroid Build Coastguard Worker void symtab_destroy(symtab_t * s)
46*2d543d20SAndroid Build Coastguard Worker {
47*2d543d20SAndroid Build Coastguard Worker 	if (!s)
48*2d543d20SAndroid Build Coastguard Worker 		return;
49*2d543d20SAndroid Build Coastguard Worker 	if (s->table)
50*2d543d20SAndroid Build Coastguard Worker 		hashtab_destroy(s->table);
51*2d543d20SAndroid Build Coastguard Worker 	return;
52*2d543d20SAndroid Build Coastguard Worker }
53*2d543d20SAndroid Build Coastguard Worker /* FLASK */
54