From: Vsevolod Stakhov Date: Tue, 2 Jun 2015 15:28:48 +0000 (+0100) Subject: Add checkpoint to avoid endless iteration. X-Git-Tag: 1.0.0~578^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c79ae2cf0d4fbf32e79b715ffb577ec9b8555fa7;p=thirdparty%2Frspamd.git Add checkpoint to avoid endless iteration. --- diff --git a/src/libserver/task.c b/src/libserver/task.c index 0f73c15f13..315732f97b 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 295ac76c39..ae2c9eaa8e 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 8262f51eaf..d860f9daf7 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;