aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-02 16:28:48 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2015-06-02 16:28:48 +0100
commitc79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7 (patch)
treee13e2563766f4df657a5b5135a7508e0c55cd225
parent6d7f11963edfd5113f32060267695c513613ec1f (diff)
downloadrspamd-c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7.tar.gz
rspamd-c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7.zip
Add checkpoint to avoid endless iteration.
-rw-r--r--src/libserver/task.c31
-rw-r--r--src/libserver/task.h2
-rw-r--r--src/lua/lua_config.c16
3 files changed, 38 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 */
diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c
index 8262f51ea..d860f9daf 100644
--- a/src/lua/lua_config.c
+++ b/src/lua/lua_config.c
@@ -517,6 +517,14 @@ rspamd_lua_call_post_filters (struct rspamd_task *task)
struct rspamd_task **ptask;
GList *cur;
+ if (task->checkpoint == NULL) {
+ task->checkpoint = GUINT_TO_POINTER (0x1);
+ }
+ else {
+ /* Do not process if done */
+ return;
+ }
+
cur = task->cfg->post_filters;
while (cur) {
cd = cur->data;
@@ -577,6 +585,14 @@ rspamd_lua_call_pre_filters (struct rspamd_task *task)
struct rspamd_task **ptask;
GList *cur;
+ if (task->checkpoint == NULL) {
+ task->checkpoint = GUINT_TO_POINTER (0x1);
+ }
+ else {
+ /* Do not process if done */
+ return;
+ }
+
cur = task->cfg->pre_filters;
while (cur) {
cd = cur->data;