summaryrefslogtreecommitdiffstats
path: root/src/libmime
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-22 14:08:26 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2017-03-22 14:08:26 +0000
commit7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87 (patch)
tree6c4911652b9bea8e5fe4f49afd522e78b93b1617 /src/libmime
parent532914ab6ccbff8ab1105e7883d2ea008858bd5a (diff)
downloadrspamd-7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87.tar.gz
rspamd-7849cfa0767a48fd6cfbf0b41f5a42c4352a0e87.zip
[Fix] Preserve order of options in symbols
Diffstat (limited to 'src/libmime')
-rw-r--r--src/libmime/filter.c26
-rw-r--r--src/libmime/filter.h6
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;