bb24249747
Makes the key argument passed into hashtab_search and all the functions it calls constant. These functions include hash table function pointers hash_value and keycmp. The only implementations of these currently are symhash and symcmp, which do not modify the key. The key parameter should never be changed by any of these, so it should be const. This is necessary to allow calling these functions with keys found in kernel object class and permission definitions. Signed-off-by: Chad Sellers <csellers@tresys.com> Acked-by: Stephen Smalley <sds@tycho.nsa.gov> Signed-off-by: James Morris <jmorris@namei.org>
45 lines
869 B
C
45 lines
869 B
C
/*
|
|
* Implementation of the symbol table type.
|
|
*
|
|
* Author : Stephen Smalley, <sds@epoch.ncsc.mil>
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/string.h>
|
|
#include <linux/errno.h>
|
|
#include "symtab.h"
|
|
|
|
static unsigned int symhash(struct hashtab *h, const void *key)
|
|
{
|
|
const char *p, *keyp;
|
|
unsigned int size;
|
|
unsigned int val;
|
|
|
|
val = 0;
|
|
keyp = key;
|
|
size = strlen(keyp);
|
|
for (p = keyp; (p - keyp) < size; p++)
|
|
val = (val << 4 | (val >> (8*sizeof(unsigned int)-4))) ^ (*p);
|
|
return val & (h->size - 1);
|
|
}
|
|
|
|
static int symcmp(struct hashtab *h, const void *key1, const void *key2)
|
|
{
|
|
const char *keyp1, *keyp2;
|
|
|
|
keyp1 = key1;
|
|
keyp2 = key2;
|
|
return strcmp(keyp1, keyp2);
|
|
}
|
|
|
|
|
|
int symtab_init(struct symtab *s, unsigned int size)
|
|
{
|
|
s->table = hashtab_create(symhash, symcmp, size);
|
|
if (!s->table)
|
|
return -1;
|
|
s->nprim = 0;
|
|
return 0;
|
|
}
|
|
|