summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2020-04-08 14:09:12 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2020-04-08 14:09:12 +0100
commit4b448965ed4611ac6c44ab66a602b75c088bdc96 (patch)
tree618d8fa544b668dc7e0337826e4da3bd770a25e3
parente02ab407883526478b736d61f1ff7c76155f9016 (diff)
downloadrspamd-4b448965ed4611ac6c44ab66a602b75c088bdc96.tar.gz
rspamd-4b448965ed4611ac6c44ab66a602b75c088bdc96.zip
[Project] Process composites separately for each shadow result
-rw-r--r--src/libserver/composites.c23
-rw-r--r--src/libserver/composites.h2
-rw-r--r--src/libserver/task.c4
3 files changed, 18 insertions, 11 deletions
diff --git a/src/libserver/composites.c b/src/libserver/composites.c
index c35ba2431..04b0a4ef8 100644
--- a/src/libserver/composites.c
+++ b/src/libserver/composites.c
@@ -201,7 +201,7 @@ rspamd_composite_process_single_symbol (struct composites_data *cd,
struct rspamd_composite *ncomp;
struct rspamd_task *task = cd->task;
- if ((ms = rspamd_task_find_symbol_result (cd->task, sym, NULL)) == NULL) {
+ if ((ms = rspamd_task_find_symbol_result (cd->task, sym, cd->metric_res)) == NULL) {
msg_debug_composites ("not found symbol %s in composite %s", sym,
cd->composite->sym);
if ((ncomp =
@@ -225,14 +225,16 @@ rspamd_composite_process_single_symbol (struct composites_data *cd,
cd->composite = saved;
clrbit (cd->checked, cd->composite->id * 2);
- ms = rspamd_task_find_symbol_result (cd->task, sym, NULL);
+ ms = rspamd_task_find_symbol_result (cd->task, sym,
+ cd->metric_res);
}
else {
/*
* XXX: in case of cyclic references this would return 0
*/
if (isset (cd->checked, ncomp->id * 2 + 1)) {
- ms = rspamd_task_find_symbol_result (cd->task, sym, NULL);
+ ms = rspamd_task_find_symbol_result (cd->task, sym,
+ cd->metric_res);
}
}
}
@@ -396,7 +398,7 @@ rspamd_composite_expr_process (void *ud,
if (isset (cd->checked, cd->composite->id * 2)) {
/* We have already checked this composite, so just return its value */
if (isset (cd->checked, cd->composite->id * 2 + 1)) {
- ms = rspamd_task_find_symbol_result (cd->task, sym, NULL);
+ ms = rspamd_task_find_symbol_result (cd->task, sym, cd->metric_res);
}
if (ms) {
@@ -563,7 +565,8 @@ composites_foreach_callback (gpointer key, gpointer value, void *data)
clrbit (cd->checked, comp->id * 2 + 1);
}
else {
- if (rspamd_task_find_symbol_result (cd->task, key, NULL) != NULL) {
+ if (rspamd_task_find_symbol_result (cd->task, key,
+ cd->metric_res) != NULL) {
/* Already set, no need to check */
msg_debug_composites ("composite %s is already in metric "
"in composites bitfield", cd->composite->sym);
@@ -652,7 +655,7 @@ composites_remove_symbols (gpointer key, gpointer value, gpointer data)
}
}
- ms = rspamd_task_find_symbol_result (task, rd->sym, NULL);
+ ms = rspamd_task_find_symbol_result (task, rd->sym, cd->metric_res);
if (has_valid_op && ms && !(ms->flags & RSPAMD_SYMBOL_RESULT_IGNORED)) {
@@ -697,10 +700,14 @@ composites_metric_callback (struct rspamd_scan_result *metric_res,
}
void
-rspamd_make_composites (struct rspamd_task *task)
+rspamd_composites_process_task (struct rspamd_task *task)
{
if (task->result && !RSPAMD_TASK_IS_SKIPPED (task)) {
- composites_metric_callback (task->result, task);
+ struct rspamd_scan_result *mres;
+
+ DL_FOREACH (task->result, mres) {
+ composites_metric_callback (mres, task);
+ }
}
}
diff --git a/src/libserver/composites.h b/src/libserver/composites.h
index d9947a7dd..bb7eb8994 100644
--- a/src/libserver/composites.h
+++ b/src/libserver/composites.h
@@ -52,7 +52,7 @@ struct rspamd_composite {
* Process all results and form composite metrics from existent metrics as it is defined in config
* @param task worker's task that present message from user
*/
-void rspamd_make_composites (struct rspamd_task *task);
+void rspamd_composites_process_task (struct rspamd_task *task);
enum rspamd_composite_policy rspamd_composite_policy_from_str (const gchar *string);
diff --git a/src/libserver/task.c b/src/libserver/task.c
index a0d7bb12a..30ba0f195 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -748,7 +748,7 @@ rspamd_task_process (struct rspamd_task *task, guint stages)
break;
case RSPAMD_TASK_STAGE_COMPOSITES:
- rspamd_make_composites (task);
+ rspamd_composites_process_task (task);
break;
case RSPAMD_TASK_STAGE_POST_FILTERS:
@@ -807,7 +807,7 @@ rspamd_task_process (struct rspamd_task *task, guint stages)
break;
case RSPAMD_TASK_STAGE_COMPOSITES_POST:
/* Second run of composites processing before idempotent filters */
- rspamd_make_composites (task);
+ rspamd_composites_process_task (task);
break;
case RSPAMD_TASK_STAGE_IDEMPOTENT: