>From af11020b18f82458527b92c0280619d75881410b Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Sat, 17 Aug 2013 09:13:34 +0200 Subject: [PATCH 1/2] check hash table --- src/responder/nss/nsssrv_mmap_cache.c | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c index c34997b8034d05796687ff7d380b367d5c7bba06..4afee22486cd45fd9a10d86b0eedc85d677ab5ee 100644 --- a/src/responder/nss/nsssrv_mmap_cache.c +++ b/src/responder/nss/nsssrv_mmap_cache.c @@ -161,6 +161,68 @@ static uint32_t sss_mc_hash(struct sss_mc_ctx *mcc, return murmurhash3(key, len, mcc->seed) % MC_HT_ELEMS(mcc->ht_size); } +static char sync_var=0; + +#ifdef DEBUG_MCC +static char seg_var=0; +#define EXCEPTION do {\ + seg_var+=1; \ + return seg_var; \ +}while(0) + +#else /* !DEBUG_MCC */ + #define EXCEPTION do {\ + char *ptr =NULL;\ + char b =0;\ + return b + ptr[0];\ + }while(0) +#endif /* DEBUG_MCC */ + +char sss_check_hash_table(struct sss_mc_ctx *mcc) +{ + volatile uint32_t i; + + const uint32_t ht_elems = MC_HT_ELEMS(mcc->ht_size); + uint32_t *hash_table = mcc->hash_table; + + volatile uint32_t slot; + + const uint32_t dt_elems = mcc->dt_size / MC_SLOT_SIZE; + + struct sss_mc_rec * volatile rec; + for (i=0; i= dt_elems) { + EXCEPTION; + } + + rec = MC_SLOT_TO_PTR(mcc->data_table, slot, struct sss_mc_rec); + if ((rec->b1 == MC_INVALID_VAL) || + (rec->b1 != rec->b2)) { + EXCEPTION; + } + + if (!MC_CHECK_RECORD_LENGTH(mcc, rec)) { + EXCEPTION; + } + + if (rec->hash1 >= ht_elems) { + EXCEPTION; + } + + if (rec->hash2 >= ht_elems) { + EXCEPTION; + } + } + + /* all tests passed */ + return true; +} + static void sss_mc_add_rec_to_chain(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec, uint32_t hash) @@ -278,9 +340,15 @@ static void sss_mc_free_slots(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec) } } +static uint8_t backup_memory[6806312+1]; + static void sss_mc_invalidate_rec(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec) { + static struct sss_mc_rec backup; + memcpy(&backup, rec, sizeof(backup)); + memcpy(backup_memory, mcc->mmap_base, mcc->mmap_size); + if (rec->b1 == MC_INVALID_VAL) { /* record already invalid */ return; @@ -305,6 +373,9 @@ static void sss_mc_invalidate_rec(struct sss_mc_ctx *mcc, rec->hash1 = MC_INVALID_VAL32; rec->hash2 = MC_INVALID_VAL32; MC_LOWER_BARRIER(rec); + + sync_var += sss_check_hash_table(mcc); + (void) backup; /* unused, debug purpose */ } static bool sss_mc_is_valid_rec(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec) @@ -733,6 +804,7 @@ errno_t sss_mmap_cache_pw_store(struct sss_mc_ctx **_mcc, /* finally chain the rec in the hash table */ sss_mmap_chain_in_rec(mcc, rec); + sync_var += sss_check_hash_table(mcc); return EOK; } -- 1.8.3.1