diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-03-22 14:08:26 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2017-03-22 14:08:26 +0000 |
commit | 7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87 (patch) | |
tree | 6c4911652b9bea8e5fe4f49afd522e78b93b1617 /src/libmime | |
parent | 532914ab6ccbff8ab1105e7883d2ea008858bd5a (diff) | |
download | rspamd-7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87.tar.gz rspamd-7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87.zip |
[Fix] Preserve order of options in symbols
Diffstat (limited to 'src/libmime')
-rw-r--r-- | src/libmime/filter.c | 26 | ||||
-rw-r--r-- | src/libmime/filter.h | 6 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/libmime/filter.c b/src/libmime/filter.c index 9d094d9ac..1356cca20 100644 --- a/src/libmime/filter.c +++ b/src/libmime/filter.c @@ -21,6 +21,7 @@ #include "lua/lua_common.h" #include "cryptobox.h" #include <math.h> +#include "contrib/uthash/utlist.h" #define COMMON_PART_FACTOR 95 @@ -318,19 +319,22 @@ rspamd_task_insert_result_single (struct rspamd_task *task, gboolean rspamd_task_add_result_option (struct rspamd_task *task, - struct rspamd_symbol_result *s, const gchar *opt) + struct rspamd_symbol_result *s, const gchar *val) { - char *opt_cpy; + struct rspamd_symbol_option *opt; gboolean ret = FALSE; - if (s && opt) { + if (s && val) { if (s->options && !(s->sym && (s->sym->flags & RSPAMD_SYMBOL_FLAG_ONEPARAM)) && g_hash_table_size (s->options) < task->cfg->default_max_shots) { /* Append new options */ - if (!g_hash_table_lookup (s->options, opt)) { - opt_cpy = rspamd_mempool_strdup (task->task_pool, opt); - g_hash_table_insert (s->options, opt_cpy, opt_cpy); + if (!g_hash_table_lookup (s->options, val)) { + opt = rspamd_mempool_alloc (task->task_pool, sizeof (*opt)); + opt->option = rspamd_mempool_strdup (task->task_pool, val); + DL_APPEND (s->opts_head, opt); + + g_hash_table_insert (s->options, opt->option, opt); ret = TRUE; } } @@ -340,12 +344,16 @@ rspamd_task_add_result_option (struct rspamd_task *task, rspamd_mempool_add_destructor (task->task_pool, (rspamd_mempool_destruct_t)g_hash_table_unref, s->options); - opt_cpy = rspamd_mempool_strdup (task->task_pool, opt); - g_hash_table_insert (s->options, opt_cpy, opt_cpy); + opt = rspamd_mempool_alloc (task->task_pool, sizeof (*opt)); + opt->option = rspamd_mempool_strdup (task->task_pool, val); + s->opts_head = NULL; + DL_APPEND (s->opts_head, opt); + + g_hash_table_insert (s->options, opt->option, opt); ret = TRUE; } } - else if (!opt) { + else if (!val) { ret = TRUE; } diff --git a/src/libmime/filter.h b/src/libmime/filter.h index 920009d9c..3d8fa38a8 100644 --- a/src/libmime/filter.h +++ b/src/libmime/filter.h @@ -14,12 +14,18 @@ struct rspamd_task; struct rspamd_settings; struct rspamd_classifier_config; +struct rspamd_symbol_option { + gchar *option; + struct rspamd_symbol_option *prev, *next; +}; + /** * Rspamd symbol */ struct rspamd_symbol_result { double score; /**< symbol's score */ GHashTable *options; /**< list of symbol's options */ + struct rspamd_symbol_option *opts_head; /**< head of linked list of options */ const gchar *name; struct rspamd_symbol *sym; /**< symbol configuration */ guint nshots; |