diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-02 16:28:48 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-06-02 16:28:48 +0100 |
commit | c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7 (patch) | |
tree | e13e2563766f4df657a5b5135a7508e0c55cd225 /src/libserver | |
parent | 6d7f11963edfd5113f32060267695c513613ec1f (diff) | |
download | rspamd-c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7.tar.gz rspamd-c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7.zip |
Add checkpoint to avoid endless iteration.
Diffstat (limited to 'src/libserver')
-rw-r--r-- | src/libserver/task.c | 31 | ||||
-rw-r--r-- | src/libserver/task.h | 2 |
2 files changed, 22 insertions, 11 deletions
diff --git a/src/libserver/task.c b/src/libserver/task.c index 0f73c15f1..315732f97 100644 --- a/src/libserver/task.c +++ b/src/libserver/task.c @@ -364,17 +364,25 @@ rspamd_process_filters (struct rspamd_task *task) gpointer item = NULL; /* Insert default metric to be sure that it exists all the time */ - /* TODO: make preprocessing only once */ - rspamd_create_metric_result (task, DEFAULT_METRIC); - if (task->settings) { - const ucl_object_t *wl; - - wl = ucl_object_find_key (task->settings, "whitelist"); - if (wl != NULL) { - msg_info ("<%s> is whitelisted", task->message_id); - task->flags |= RSPAMD_TASK_FLAG_SKIP; - return TRUE; + + if (task->checkpoint == NULL) { + rspamd_create_metric_result (task, DEFAULT_METRIC); + if (task->settings) { + const ucl_object_t *wl; + + wl = ucl_object_find_key (task->settings, "whitelist"); + if (wl != NULL) { + msg_info ("<%s> is whitelisted", task->message_id); + task->flags |= RSPAMD_TASK_FLAG_SKIP; + return TRUE; + } } + + task->checkpoint = GUINT_TO_POINTER (0x1); + } + else { + /* TODO: in future, we need to add dependencies here */ + return TRUE; } /* Process metrics symbols */ @@ -462,6 +470,9 @@ rspamd_task_process (struct rspamd_task *task, guint stages) msg_debug ("completed stage %d", st); task->processed_stages |= st; + /* Reset checkpoint */ + task->checkpoint = NULL; + /* Tail recursion */ return rspamd_task_process (task, stages); } diff --git a/src/libserver/task.h b/src/libserver/task.h index 295ac76c3..ae2c9eaa8 100644 --- a/src/libserver/task.h +++ b/src/libserver/task.h @@ -168,7 +168,7 @@ struct rspamd_task { struct rspamd_dns_resolver *resolver; /**< DNS resolver */ struct event_base *ev_base; /**< Event base */ - gpointer classify_data; /**< Opaque classifiers data */ + gpointer checkpoint; /**< Opaque checkpoint data */ struct { enum rspamd_metric_action action; /**< Action of pre filters */ |