]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Avoid collision hacks in mempool variables hash 5357/head
authorVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 27 Feb 2025 11:21:07 +0000 (11:21 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 27 Feb 2025 11:21:07 +0000 (11:21 +0000)
I don't want to debug that again!

src/libutil/mem_pool.c
src/libutil/mem_pool_internal.h

index 2912d423ce7dd5bf81bc9f57e4cc1d74be42ad48..3dc67bc5f57fc2f88b53b2f35422b75225d2bfa9 100644 (file)
@@ -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.
@@ -984,8 +984,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 +1156,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 +1173,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 +1192,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 +1211,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 +1232,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 +1250,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;
index 26a687b6caf31cda0ecbf1e1dd64ac8a68cf3fc3..2f9ad15b69a3fcff161ff2113c14bd33918331d6 100644 (file)
@@ -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.
@@ -63,8 +63,8 @@ struct rspamd_mempool_variable {
 };
 
 KHASH_INIT(rspamd_mempool_vars_hash,
-                  uint32_t, struct rspamd_mempool_variable, 1,
-                  kh_int_hash_func, kh_int_hash_equal);
+                  const char *, struct rspamd_mempool_variable, 1,
+                  kh_str_hash_func, kh_str_hash_equal);
 
 struct rspamd_mempool_specific {
        struct _pool_chain *pools[RSPAMD_MEMPOOL_MAX];