mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
selinux: Move avtab_hash() to a shared location for future reuse
This is a preparation patch, no functional change. Signed-off-by: Hongru Zhang <zhanghongru@xiaomi.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
This commit is contained in:
46
security/selinux/include/hash.h
Normal file
46
security/selinux/include/hash.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
|
||||
#ifndef _SELINUX_HASH_H_
|
||||
#define _SELINUX_HASH_H_
|
||||
|
||||
/* Based on MurmurHash3, written by Austin Appleby and placed in the
|
||||
* public domain.
|
||||
*/
|
||||
static inline u32 avtab_hash(const struct avtab_key *keyp, u32 mask)
|
||||
{
|
||||
static const u32 c1 = 0xcc9e2d51;
|
||||
static const u32 c2 = 0x1b873593;
|
||||
static const u32 r1 = 15;
|
||||
static const u32 r2 = 13;
|
||||
static const u32 m = 5;
|
||||
static const u32 n = 0xe6546b64;
|
||||
|
||||
u32 hash = 0;
|
||||
|
||||
#define mix(input) \
|
||||
do { \
|
||||
u32 v = input; \
|
||||
v *= c1; \
|
||||
v = (v << r1) | (v >> (32 - r1)); \
|
||||
v *= c2; \
|
||||
hash ^= v; \
|
||||
hash = (hash << r2) | (hash >> (32 - r2)); \
|
||||
hash = hash * m + n; \
|
||||
} while (0)
|
||||
|
||||
mix(keyp->target_class);
|
||||
mix(keyp->target_type);
|
||||
mix(keyp->source_type);
|
||||
|
||||
#undef mix
|
||||
|
||||
hash ^= hash >> 16;
|
||||
hash *= 0x85ebca6b;
|
||||
hash ^= hash >> 13;
|
||||
hash *= 0xc2b2ae35;
|
||||
hash ^= hash >> 16;
|
||||
|
||||
return hash & mask;
|
||||
}
|
||||
|
||||
#endif /* _SELINUX_HASH_H_ */
|
||||
@@ -20,50 +20,11 @@
|
||||
#include <linux/errno.h>
|
||||
#include "avtab.h"
|
||||
#include "policydb.h"
|
||||
#include "hash.h"
|
||||
|
||||
static struct kmem_cache *avtab_node_cachep __ro_after_init;
|
||||
static struct kmem_cache *avtab_xperms_cachep __ro_after_init;
|
||||
|
||||
/* Based on MurmurHash3, written by Austin Appleby and placed in the
|
||||
* public domain.
|
||||
*/
|
||||
static inline u32 avtab_hash(const struct avtab_key *keyp, u32 mask)
|
||||
{
|
||||
static const u32 c1 = 0xcc9e2d51;
|
||||
static const u32 c2 = 0x1b873593;
|
||||
static const u32 r1 = 15;
|
||||
static const u32 r2 = 13;
|
||||
static const u32 m = 5;
|
||||
static const u32 n = 0xe6546b64;
|
||||
|
||||
u32 hash = 0;
|
||||
|
||||
#define mix(input) \
|
||||
do { \
|
||||
u32 v = input; \
|
||||
v *= c1; \
|
||||
v = (v << r1) | (v >> (32 - r1)); \
|
||||
v *= c2; \
|
||||
hash ^= v; \
|
||||
hash = (hash << r2) | (hash >> (32 - r2)); \
|
||||
hash = hash * m + n; \
|
||||
} while (0)
|
||||
|
||||
mix(keyp->target_class);
|
||||
mix(keyp->target_type);
|
||||
mix(keyp->source_type);
|
||||
|
||||
#undef mix
|
||||
|
||||
hash ^= hash >> 16;
|
||||
hash *= 0x85ebca6b;
|
||||
hash ^= hash >> 13;
|
||||
hash *= 0xc2b2ae35;
|
||||
hash ^= hash >> 16;
|
||||
|
||||
return hash & mask;
|
||||
}
|
||||
|
||||
static struct avtab_node *avtab_insert_node(struct avtab *h,
|
||||
struct avtab_node **dst,
|
||||
const struct avtab_key *key,
|
||||
|
||||
Reference in New Issue
Block a user