commit b80e8b8: [Project] Rework some more functions to work with shadow results

Vsevolod Stakhov vsevolod at highsecure.ru
Tue Apr 14 14:56:06 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-04-14 11:35:52 +0100
URL: https://github.com/rspamd/rspamd/commit/b80e8b8477dd019ad9384541d499b57f5432393a

[Project] Rework some more functions to work with shadow results

---
 src/libmime/message.c        |  2 +-
 src/libmime/scan_result.c    | 50 ++++++++++++++++++++++----------------------
 src/libmime/scan_result.h    | 17 ++++++++-------
 src/libserver/protocol.c     |  4 ++--
 src/libserver/roll_history.c |  2 +-
 src/libserver/task.c         | 10 ++++-----
 src/lua/lua_task.c           |  6 +++---
 7 files changed, 46 insertions(+), 45 deletions(-)

diff --git a/src/libmime/message.c b/src/libmime/message.c
index 49d879090..4847c4046 100644
--- a/src/libmime/message.c
+++ b/src/libmime/message.c
@@ -847,7 +847,7 @@ rspamd_message_process_text_part_maybe (struct rspamd_task *task,
 
 			rspamd_add_passthrough_result (task, action,
 					RSPAMD_PASSTHROUGH_CRITICAL,
-					score, "Gtube pattern", "GTUBE", 0);
+					score, "Gtube pattern", "GTUBE", 0, NULL);
 		}
 
 		rspamd_task_insert_result (task, GTUBE_SYMBOL, 0, NULL);
diff --git a/src/libmime/scan_result.c b/src/libmime/scan_result.c
index 859905386..d299aa2ee 100644
--- a/src/libmime/scan_result.c
+++ b/src/libmime/scan_result.c
@@ -123,18 +123,15 @@ rspamd_pr_sort (const struct rspamd_passthrough_result *pra,
 }
 
 void
-rspamd_add_passthrough_result (struct rspamd_task *task,
-									struct rspamd_action *action,
-									guint priority,
-									double target_score,
-									const gchar *message,
-									const gchar *module,
-									guint flags)
+rspamd_add_passthrough_result (struct rspamd_task *task, struct rspamd_action *action, guint priority,
+							   double target_score, const gchar *message, const gchar *module, guint flags,
+							   struct rspamd_scan_result *scan_result)
 {
-	struct rspamd_scan_result *metric_res;
 	struct rspamd_passthrough_result *pr;
 
-	metric_res = task->result;
+	if (scan_result == NULL) {
+		scan_result = task->result;
+	}
 
 	pr = rspamd_mempool_alloc (task->task_pool, sizeof (*pr));
 	pr->action = action;
@@ -144,8 +141,8 @@ rspamd_add_passthrough_result (struct rspamd_task *task,
 	pr->target_score = target_score;
 	pr->flags = flags;
 
-	DL_APPEND (metric_res->passthrough_result, pr);
-	DL_SORT (metric_res->passthrough_result, rspamd_pr_sort);
+	DL_APPEND (scan_result->passthrough_result, pr);
+	DL_SORT (scan_result->passthrough_result, rspamd_pr_sort);
 
 	if (!isnan (target_score)) {
 
@@ -713,9 +710,10 @@ rspamd_task_add_result_option (struct rspamd_task *task,
 	return ret;
 }
 
-struct rspamd_action*
+struct rspamd_action *
 rspamd_check_action_metric (struct rspamd_task *task,
-							struct rspamd_passthrough_result **ppr)
+							struct rspamd_passthrough_result **ppr,
+							struct rspamd_scan_result *scan_result)
 {
 	struct rspamd_action_result *action_lim,
 			*noaction = NULL;
@@ -723,11 +721,14 @@ rspamd_check_action_metric (struct rspamd_task *task,
 	struct rspamd_passthrough_result *pr, *sel_pr = NULL;
 	double max_score = -(G_MAXDOUBLE), sc;
 	int i;
-	struct rspamd_scan_result *mres = task->result;
 	gboolean seen_least = FALSE;
 
-	if (mres->passthrough_result != NULL)  {
-		DL_FOREACH (mres->passthrough_result, pr) {
+	if (scan_result == NULL) {
+		scan_result = task->result;
+	}
+
+	if (scan_result->passthrough_result != NULL)  {
+		DL_FOREACH (scan_result->passthrough_result, pr) {
 			if (!seen_least || !(pr->flags & RSPAMD_PASSTHROUGH_LEAST)) {
 				sc = pr->target_score;
 				selected_action = pr->action;
@@ -735,10 +736,10 @@ rspamd_check_action_metric (struct rspamd_task *task,
 				if (!(pr->flags & RSPAMD_PASSTHROUGH_LEAST)) {
 					if (!isnan (sc)) {
 						if (pr->action->action_type == METRIC_ACTION_NOACTION) {
-							mres->score = MIN (sc, mres->score);
+							scan_result->score = MIN (sc, scan_result->score);
 						}
 						else {
-							mres->score = sc;
+							scan_result->score = sc;
 						}
 					}
 
@@ -782,13 +783,12 @@ rspamd_check_action_metric (struct rspamd_task *task,
 			}
 		}
 	}
-	/* We are not certain about the results during processing */
 
 	/*
 	 * Select result by score
 	 */
-	for (i = mres->nactions - 1; i >= 0; i--) {
-		action_lim = &mres->actions_limits[i];
+	for (i = scan_result->nactions - 1; i >= 0; i--) {
+		action_lim = &scan_result->actions_limits[i];
 		sc = action_lim->cur_limit;
 
 		if (action_lim->action->action_type == METRIC_ACTION_NOACTION) {
@@ -800,7 +800,7 @@ rspamd_check_action_metric (struct rspamd_task *task,
 			continue;
 		}
 
-		if (mres->score >= sc && sc > max_score) {
+		if (scan_result->score >= sc && sc > max_score) {
 			selected_action = action_lim->action;
 			max_score = sc;
 		}
@@ -813,7 +813,7 @@ rspamd_check_action_metric (struct rspamd_task *task,
 	if (selected_action) {
 
 		if (seen_least) {
-
+			/* Adjust least action */
 			if (least_action->flags & RSPAMD_ACTION_NO_THRESHOLD) {
 				if (selected_action->action_type != METRIC_ACTION_REJECT &&
 						selected_action->action_type != METRIC_ACTION_DISCARD) {
@@ -827,12 +827,12 @@ rspamd_check_action_metric (struct rspamd_task *task,
 			}
 			else {
 				/* Adjust score if needed */
-				if (max_score > mres->score) {
+				if (max_score > scan_result->score) {
 					if (ppr) {
 						*ppr = sel_pr;
 					}
 
-					mres->score = max_score;
+					scan_result->score = max_score;
 				}
 			}
 		}
diff --git a/src/libmime/scan_result.h b/src/libmime/scan_result.h
index dcae2609c..3dee11ddd 100644
--- a/src/libmime/scan_result.h
+++ b/src/libmime/scan_result.h
@@ -118,12 +118,10 @@ struct rspamd_scan_result *rspamd_find_metric_result (struct rspamd_task *task,
  * @param module
  */
 void rspamd_add_passthrough_result (struct rspamd_task *task,
-									struct rspamd_action *action,
-									guint priority,
-									double target_score,
-									const gchar *message,
-									const gchar *module,
-									guint flags);
+									struct rspamd_action *action, guint priority,
+									double target_score, const gchar *message,
+									const gchar *module, guint flags,
+									struct rspamd_scan_result *scan_result);
 
 enum rspamd_symbol_insert_flags {
 	RSPAMD_SYMBOL_INSERT_DEFAULT = 0,
@@ -178,7 +176,9 @@ rspamd_task_find_symbol_result (struct rspamd_task *task, const char *sym,
  * @param func
  * @param ud
  */
-void rspamd_task_symbol_result_foreach (struct rspamd_task *task, struct rspamd_scan_result *result, GHFunc func,
+void rspamd_task_symbol_result_foreach (struct rspamd_task *task,
+										struct rspamd_scan_result *result,
+										GHFunc func,
 										gpointer ud);
 
 /**
@@ -199,7 +199,8 @@ double rspamd_factor_consolidation_func (struct rspamd_task *task,
  * @return
  */
 struct rspamd_action *rspamd_check_action_metric (struct rspamd_task *task,
-												  struct rspamd_passthrough_result **ppr);
+												  struct rspamd_passthrough_result **ppr,
+												  struct rspamd_scan_result *scan_result);
 
 #ifdef  __cplusplus
 }
diff --git a/src/libserver/protocol.c b/src/libserver/protocol.c
index 35d50b909..9d1276064 100644
--- a/src/libserver/protocol.c
+++ b/src/libserver/protocol.c
@@ -1182,7 +1182,7 @@ rspamd_scan_result_ucl (struct rspamd_task *task,
 	const gchar *subject;
 	struct rspamd_passthrough_result *pr = NULL;
 
-	action = rspamd_check_action_metric (task, &pr);
+	action = rspamd_check_action_metric (task, &pr, NULL);
 	is_spam = !(action->flags & RSPAMD_ACTION_HAM);
 
 	if (task->cmd == CMD_CHECK) {
@@ -1761,7 +1761,7 @@ end:
 
 		if (metric_res != NULL) {
 
-			action = rspamd_check_action_metric (task, NULL);
+			action = rspamd_check_action_metric (task, NULL, NULL);
 			/* TODO: handle custom actions in stats */
 			if (action->action_type == METRIC_ACTION_SOFT_REJECT &&
 					(task->flags & RSPAMD_TASK_FLAG_GREYLISTED)) {
diff --git a/src/libserver/roll_history.c b/src/libserver/roll_history.c
index 6add06e62..8f50de693 100644
--- a/src/libserver/roll_history.c
+++ b/src/libserver/roll_history.c
@@ -160,7 +160,7 @@ rspamd_roll_history_update (struct roll_history *history,
 	}
 	else {
 		row->score = metric_res->score;
-		action = rspamd_check_action_metric (task, NULL);
+		action = rspamd_check_action_metric (task, NULL, NULL);
 		row->action = action->action_type;
 		row->required_score = rspamd_task_get_required_score (task, metric_res);
 		cbdata.pos = row->symbols;
diff --git a/src/libserver/task.c b/src/libserver/task.c
index 30ba0f195..12f20f393 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -1077,7 +1077,7 @@ rspamd_task_log_metric_res (struct rspamd_task *task,
 	khiter_t k;
 
 	mres = task->result;
-	act = rspamd_check_action_metric (task, NULL);
+	act = rspamd_check_action_metric (task, NULL, NULL);
 
 	if (mres != NULL) {
 		switch (lf->type) {
@@ -1876,7 +1876,7 @@ rspamd_task_timeout (EV_P_ ev_timer *w, int revents)
 		if (task->cfg->soft_reject_on_timeout) {
 			struct rspamd_action *action, *soft_reject;
 
-			action = rspamd_check_action_metric (task, NULL);
+			action = rspamd_check_action_metric (task, NULL, NULL);
 
 			if (action->action_type != METRIC_ACTION_REJECT) {
 				soft_reject = rspamd_config_get_action_by_type (task->cfg,
@@ -1887,7 +1887,7 @@ rspamd_task_timeout (EV_P_ ev_timer *w, int revents)
 						NAN,
 						"timeout processing message",
 						"task timeout",
-						0);
+						0, NULL);
 			}
 		}
 
@@ -1905,7 +1905,7 @@ rspamd_task_timeout (EV_P_ ev_timer *w, int revents)
 		if (task->cfg->soft_reject_on_timeout) {
 			struct rspamd_action *action, *soft_reject;
 
-			action = rspamd_check_action_metric (task, NULL);
+			action = rspamd_check_action_metric (task, NULL, NULL);
 
 			if (action->action_type != METRIC_ACTION_REJECT) {
 				soft_reject = rspamd_config_get_action_by_type (task->cfg,
@@ -1916,7 +1916,7 @@ rspamd_task_timeout (EV_P_ ev_timer *w, int revents)
 						NAN,
 						"timeout post-processing message",
 						"task timeout",
-						0);
+						0, NULL);
 			}
 		}
 
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 6f1eeaf3f..5285e1087 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -2141,7 +2141,7 @@ lua_task_set_pre_result (lua_State * L)
 				score,
 				rspamd_mempool_strdup (task->task_pool, message),
 				rspamd_mempool_strdup (task->task_pool, module),
-				flags);
+				flags, NULL);
 
 		/* Don't classify or filter message if pre-filter sets results */
 
@@ -5906,7 +5906,7 @@ lua_task_get_metric_result (lua_State *L)
 		lua_pushnumber (L, metric_res->score);
 		lua_settable (L, -3);
 
-		action = rspamd_check_action_metric (task, NULL);
+		action = rspamd_check_action_metric (task, NULL, NULL);
 
 		if (action) {
 			lua_pushstring (L, "action");
@@ -5977,7 +5977,7 @@ lua_task_get_metric_action (lua_State *L)
 	struct rspamd_action *action;
 
 	if (task) {
-		action = rspamd_check_action_metric (task, NULL);
+		action = rspamd_check_action_metric (task, NULL, NULL);
 		lua_pushstring (L, action->name);
 	}
 	else {


More information about the Commits mailing list