xref: /third_party/selinux/libsepol/src/symtab.c (revision 6cd6a6ac)
16cd6a6acSopenharmony_ci
26cd6a6acSopenharmony_ci/* Author : Stephen Smalley, <sds@tycho.nsa.gov> */
36cd6a6acSopenharmony_ci
46cd6a6acSopenharmony_ci/* FLASK */
56cd6a6acSopenharmony_ci
66cd6a6acSopenharmony_ci/*
76cd6a6acSopenharmony_ci * Implementation of the symbol table type.
86cd6a6acSopenharmony_ci */
96cd6a6acSopenharmony_ci
106cd6a6acSopenharmony_ci#include <string.h>
116cd6a6acSopenharmony_ci
126cd6a6acSopenharmony_ci#include "private.h"
136cd6a6acSopenharmony_ci
146cd6a6acSopenharmony_ci#include <sepol/policydb/hashtab.h>
156cd6a6acSopenharmony_ci#include <sepol/policydb/symtab.h>
166cd6a6acSopenharmony_ci
176cd6a6acSopenharmony_ciignore_unsigned_overflow_
186cd6a6acSopenharmony_cistatic unsigned int symhash(hashtab_t h, const_hashtab_key_t key)
196cd6a6acSopenharmony_ci{
206cd6a6acSopenharmony_ci	const char *p, *keyp;
216cd6a6acSopenharmony_ci	size_t size;
226cd6a6acSopenharmony_ci	unsigned int val;
236cd6a6acSopenharmony_ci
246cd6a6acSopenharmony_ci	val = 0;
256cd6a6acSopenharmony_ci	keyp = (const char *)key;
266cd6a6acSopenharmony_ci	size = strlen(keyp);
276cd6a6acSopenharmony_ci	for (p = keyp; ((size_t) (p - keyp)) < size; p++)
286cd6a6acSopenharmony_ci		val =
296cd6a6acSopenharmony_ci		    (val << 4 | (val >> (8 * sizeof(unsigned int) - 4))) ^ (*p);
306cd6a6acSopenharmony_ci	return val & (h->size - 1);
316cd6a6acSopenharmony_ci}
326cd6a6acSopenharmony_ci
336cd6a6acSopenharmony_cistatic int symcmp(hashtab_t h
346cd6a6acSopenharmony_ci		  __attribute__ ((unused)), const_hashtab_key_t key1,
356cd6a6acSopenharmony_ci		  const_hashtab_key_t key2)
366cd6a6acSopenharmony_ci{
376cd6a6acSopenharmony_ci	return strcmp(key1, key2);
386cd6a6acSopenharmony_ci}
396cd6a6acSopenharmony_ci
406cd6a6acSopenharmony_ciint symtab_init(symtab_t * s, unsigned int size)
416cd6a6acSopenharmony_ci{
426cd6a6acSopenharmony_ci	s->table = hashtab_create(symhash, symcmp, size);
436cd6a6acSopenharmony_ci	if (!s->table)
446cd6a6acSopenharmony_ci		return -1;
456cd6a6acSopenharmony_ci	s->nprim = 0;
466cd6a6acSopenharmony_ci	return 0;
476cd6a6acSopenharmony_ci}
486cd6a6acSopenharmony_ci
496cd6a6acSopenharmony_civoid symtab_destroy(symtab_t * s)
506cd6a6acSopenharmony_ci{
516cd6a6acSopenharmony_ci	if (!s)
526cd6a6acSopenharmony_ci		return;
536cd6a6acSopenharmony_ci	if (s->table)
546cd6a6acSopenharmony_ci		hashtab_destroy(s->table);
556cd6a6acSopenharmony_ci	return;
566cd6a6acSopenharmony_ci}
576cd6a6acSopenharmony_ci/* FLASK */
58