diff options
Diffstat (limited to 'src/libutil/mem_pool.c')
-rw-r--r-- | src/libutil/mem_pool.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c index 2912d423c..575b4e497 100644 --- a/src/libutil/mem_pool.c +++ b/src/libutil/mem_pool.c @@ -1,5 +1,5 @@ /* - * Copyright 2024 Vsevolod Stakhov + * Copyright 2025 Vsevolod Stakhov * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -403,9 +403,10 @@ rspamd_mempool_new_(gsize size, const char *tag, int flags, const char *loc) /* Generate new uid */ uint64_t uid = rspamd_random_uint64_fast(); - rspamd_encode_hex_buf((unsigned char *) &uid, sizeof(uid), - new_pool->tag.uid, sizeof(new_pool->tag.uid) - 1); - new_pool->tag.uid[sizeof(new_pool->tag.uid) - 1] = '\0'; + G_STATIC_ASSERT(sizeof(new_pool->tag.uid) >= sizeof(uid) * 2 + 1); + int enc_len = rspamd_encode_hex_buf((unsigned char *) &uid, sizeof(uid), + new_pool->tag.uid, sizeof(new_pool->tag.uid) - 1); + new_pool->tag.uid[enc_len] = '\0'; mem_pool_stat->pools_allocated++; @@ -984,8 +985,7 @@ __mutex_spin(rspamd_mempool_mutex_t *mutex) ts.tv_sec = 0; ts.tv_nsec = MUTEX_SLEEP_TIME; /* Spin */ - while (nanosleep(&ts, &ts) == -1 && errno == EINTR) - ; + while (nanosleep(&ts, &ts) == -1 && errno == EINTR); #else #error No methods to spin are defined #endif @@ -1157,7 +1157,6 @@ void rspamd_mempool_wunlock_rwlock(rspamd_mempool_rwlock_t *lock) } #endif -#define RSPAMD_MEMPOOL_VARS_HASH_SEED 0xb32ad7c55eb2e647ULL void rspamd_mempool_set_variable(rspamd_mempool_t *pool, const char *name, gpointer value, @@ -1175,12 +1174,10 @@ void rspamd_mempool_set_variable(rspamd_mempool_t *pool, } } - int hv = rspamd_cryptobox_fast_hash(name, strlen(name), - RSPAMD_MEMPOOL_VARS_HASH_SEED); khiter_t it; int r; - it = kh_put(rspamd_mempool_vars_hash, pool->priv->variables, hv, &r); + it = kh_put(rspamd_mempool_vars_hash, pool->priv->variables, name, &r); if (it == kh_end(pool->priv->variables)) { g_assert_not_reached(); @@ -1196,6 +1193,10 @@ void rspamd_mempool_set_variable(rspamd_mempool_t *pool, pvar->dtor(pvar->data); } } + else { + /* Store copy of the key to provide persistent storage */ + kh_key(pool->priv->variables, it) = rspamd_mempool_strdup(pool, name); + } pvar = &kh_val(pool->priv->variables, it); pvar->data = value; @@ -1211,10 +1212,8 @@ rspamd_mempool_get_variable(rspamd_mempool_t *pool, const char *name) } khiter_t it; - int hv = rspamd_cryptobox_fast_hash(name, strlen(name), - RSPAMD_MEMPOOL_VARS_HASH_SEED); - it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, hv); + it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, name); if (it != kh_end(pool->priv->variables)) { struct rspamd_mempool_variable *pvar; @@ -1234,10 +1233,7 @@ rspamd_mempool_steal_variable(rspamd_mempool_t *pool, const char *name) } khiter_t it; - int hv = rspamd_cryptobox_fast_hash(name, strlen(name), - RSPAMD_MEMPOOL_VARS_HASH_SEED); - - it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, hv); + it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, name); if (it != kh_end(pool->priv->variables)) { struct rspamd_mempool_variable *pvar; @@ -1255,10 +1251,8 @@ void rspamd_mempool_remove_variable(rspamd_mempool_t *pool, const char *name) { if (pool->priv->variables != NULL) { khiter_t it; - int hv = rspamd_cryptobox_fast_hash(name, strlen(name), - RSPAMD_MEMPOOL_VARS_HASH_SEED); - it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, hv); + it = kh_get(rspamd_mempool_vars_hash, pool->priv->variables, name); if (it != kh_end(pool->priv->variables)) { struct rspamd_mempool_variable *pvar; |