commit 673c7a9: [Rework] Take disabled flag into account

Vsevolod Stakhov vsevolod at highsecure.ru
Sat Jan 29 12:42:05 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-01-29 12:39:47 +0000
URL: https://github.com/rspamd/rspamd/commit/673c7a93eacf462bc53fa82a4008b3a1ae2db3b1 (HEAD -> master)

[Rework] Take disabled flag into account
Issue: #4025

---
 src/libmime/scan_result.c | 34 +++++++++++++++++++++++++++++++---
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/libmime/scan_result.c b/src/libmime/scan_result.c
index 37244f60f..d2f7e0a8b 100644
--- a/src/libmime/scan_result.c
+++ b/src/libmime/scan_result.c
@@ -96,8 +96,10 @@ rspamd_create_metric_result (struct rspamd_task *task,
 		i = 0;
 
 		HASH_ITER (hh, task->cfg->actions, act, tmp) {
+			metric_res->actions_config[i].flags = RSPAMD_ACTION_RESULT_DEFAULT;
 			if (!(act->flags & RSPAMD_ACTION_NO_THRESHOLD)) {
 				metric_res->actions_config[i].cur_limit = act->threshold;
+				metric_res->actions_config[i].flags |= RSPAMD_ACTION_RESULT_NO_THRESHOLD;
 			}
 			metric_res->actions_config[i].action = act;
 
@@ -141,7 +143,7 @@ rspamd_add_passthrough_result (struct rspamd_task *task,
 	/* Find the speicific action config */
 	struct rspamd_action_config *action_config = NULL;
 
-	for (unsigned int i = 0; i < HASH_COUNT (task->cfg->actions); i ++) {
+	for (unsigned int i = 0; i < scan_result->nactions; i ++) {
 		struct rspamd_action_config *cur = &scan_result->actions_config[i];
 
 		/* We assume that all action pointers are static */
@@ -802,6 +804,21 @@ rspamd_task_add_result_option (struct rspamd_task *task,
 	return ret;
 }
 
+static struct rspamd_action_config *
+rspamd_find_action_config_for_action (struct rspamd_scan_result *scan_result,
+									  struct rspamd_action *act)
+{
+	for (unsigned int i = 0; i < scan_result->nactions; i ++) {
+		struct rspamd_action_config *cur = &scan_result->actions_config[i];
+
+		if (act == cur->action) {
+			return cur;
+		}
+	}
+
+	return NULL;
+}
+
 struct rspamd_action *
 rspamd_check_action_metric (struct rspamd_task *task,
 							struct rspamd_passthrough_result **ppr,
@@ -812,7 +829,6 @@ rspamd_check_action_metric (struct rspamd_task *task,
 	struct rspamd_action *selected_action = NULL, *least_action = NULL;
 	struct rspamd_passthrough_result *pr, *sel_pr = NULL;
 	double max_score = -(G_MAXDOUBLE), sc;
-	int i;
 	gboolean seen_least = FALSE;
 
 	if (scan_result == NULL) {
@@ -821,6 +837,14 @@ rspamd_check_action_metric (struct rspamd_task *task,
 
 	if (scan_result->passthrough_result != NULL)  {
 		DL_FOREACH (scan_result->passthrough_result, pr) {
+			struct rspamd_action_config *act_config =
+					rspamd_find_action_config_for_action (scan_result, pr->action);
+
+			/* Skip disabled actions */
+			if (act_config && (act_config->flags & RSPAMD_ACTION_RESULT_DISABLED)) {
+				continue;
+			}
+
 			if (!seen_least || !(pr->flags & RSPAMD_PASSTHROUGH_LEAST)) {
 				sc = pr->target_score;
 				selected_action = pr->action;
@@ -879,7 +903,7 @@ rspamd_check_action_metric (struct rspamd_task *task,
 	/*
 	 * Select result by score
 	 */
-	for (i = scan_result->nactions - 1; i >= 0; i--) {
+	for (unsigned int i = scan_result->nactions - 1; i >= 0; i--) {
 		action_lim = &scan_result->actions_config[i];
 		sc = action_lim->cur_limit;
 
@@ -887,6 +911,10 @@ rspamd_check_action_metric (struct rspamd_task *task,
 			noaction = action_lim;
 		}
 
+		if ((action_lim->flags & (RSPAMD_ACTION_RESULT_DISABLED|RSPAMD_ACTION_RESULT_NO_THRESHOLD))) {
+			continue;
+		}
+
 		if (isnan (sc) ||
 			(action_lim->action->flags & (RSPAMD_ACTION_NO_THRESHOLD|RSPAMD_ACTION_HAM))) {
 			continue;


More information about the Commits mailing list