commit b87eb86: [Project] Ressurect empty prefilters as connection filters

Vsevolod Stakhov vsevolod at highsecure.ru
Mon Oct 19 19:49:06 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-10-19 15:14:58 +0100
URL: https://github.com/rspamd/rspamd/commit/b87eb86a42e7d450a71e4b73b4910649b2d34c4e

[Project] Ressurect empty prefilters as connection filters

---
 src/libserver/rspamd_symcache.c | 59 ++++++++++++++++++++++++++++++++++++++---
 src/libserver/rspamd_symcache.h |  9 ++++---
 src/libserver/task.c            |  5 ++--
 src/libserver/task.h            |  5 ++--
 4 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c
index 3236a5e5e..831b98a3d 100644
--- a/src/libserver/rspamd_symcache.c
+++ b/src/libserver/rspamd_symcache.c
@@ -151,8 +151,9 @@ struct rspamd_symcache {
 	GHashTable *items_by_symbol;
 	GPtrArray *items_by_id;
 	struct symcache_order *items_by_order;
-	GPtrArray *filters;
+	GPtrArray *connfilters;
 	GPtrArray *prefilters;
+	GPtrArray *filters;
 	GPtrArray *postfilters;
 	GPtrArray *composites;
 	GPtrArray *idempotent;
@@ -744,6 +745,7 @@ rspamd_symcache_post_init (struct rspamd_symcache *cache)
 		}
 	}
 
+	g_ptr_array_sort_with_data (cache->connfilters, prefilters_cmp, cache);
 	g_ptr_array_sort_with_data (cache->prefilters, prefilters_cmp, cache);
 	g_ptr_array_sort_with_data (cache->postfilters, postfilters_cmp, cache);
 	g_ptr_array_sort_with_data (cache->idempotent, postfilters_cmp, cache);
@@ -1116,6 +1118,11 @@ rspamd_symcache_add_symbol (struct rspamd_symcache *cache,
 			g_ptr_array_add (cache->postfilters, item);
 			item->container = cache->postfilters;
 		}
+		else if (item->type & SYMBOL_TYPE_CONNFILTER) {
+			type_str = "connfilter";
+			g_ptr_array_add (cache->connfilters, item);
+			item->container = cache->connfilters;
+		}
 		else {
 			item->is_filter = TRUE;
 			g_ptr_array_add (cache->filters, item);
@@ -1301,8 +1308,9 @@ rspamd_symcache_destroy (struct rspamd_symcache *cache)
 		g_hash_table_destroy (cache->items_by_symbol);
 		g_ptr_array_free (cache->items_by_id, TRUE);
 		rspamd_mempool_delete (cache->static_pool);
-		g_ptr_array_free (cache->filters, TRUE);
+		g_ptr_array_free (cache->connfilters, TRUE);
 		g_ptr_array_free (cache->prefilters, TRUE);
+		g_ptr_array_free (cache->filters, TRUE);
 		g_ptr_array_free (cache->postfilters, TRUE);
 		g_ptr_array_free (cache->idempotent, TRUE);
 		g_ptr_array_free (cache->composites, TRUE);
@@ -1328,8 +1336,9 @@ rspamd_symcache_new (struct rspamd_config *cfg)
 	cache->items_by_symbol = g_hash_table_new (rspamd_str_hash,
 			rspamd_str_equal);
 	cache->items_by_id = g_ptr_array_new ();
-	cache->filters = g_ptr_array_new ();
+	cache->connfilters = g_ptr_array_new ();
 	cache->prefilters = g_ptr_array_new ();
+	cache->filters = g_ptr_array_new ();
 	cache->postfilters = g_ptr_array_new ();
 	cache->idempotent = g_ptr_array_new ();
 	cache->composites = g_ptr_array_new ();
@@ -2069,6 +2078,50 @@ rspamd_symcache_process_symbols (struct rspamd_task *task,
 	start_events_pending = rspamd_session_events_pending (task->s);
 
 	switch (stage) {
+	case RSPAMD_TASK_STAGE_CONNFILTERS:
+		/* Check for connection filters */
+		saved_priority = G_MININT;
+		all_done = TRUE;
+
+		for (i = 0; i < (gint) cache->connfilters->len; i++) {
+			item = g_ptr_array_index (cache->connfilters, i);
+			dyn_item = rspamd_symcache_get_dynamic (checkpoint, item);
+
+			if (RSPAMD_TASK_IS_SKIPPED (task)) {
+				return TRUE;
+			}
+
+			if (!CHECK_START_BIT (checkpoint, dyn_item) &&
+				!CHECK_FINISH_BIT (checkpoint, dyn_item)) {
+
+				if (checkpoint->has_slow) {
+					/* Delay */
+					checkpoint->has_slow = FALSE;
+
+					return FALSE;
+				}
+				/* Check priorities */
+				if (saved_priority == G_MININT) {
+					saved_priority = item->priority;
+				}
+				else {
+					if (item->priority < saved_priority &&
+						rspamd_session_events_pending (task->s) > start_events_pending) {
+						/*
+						 * Delay further checks as we have higher
+						 * priority filters to be processed
+						 */
+						return FALSE;
+					}
+				}
+
+				rspamd_symcache_check_symbol (task, cache, item,
+						checkpoint);
+				all_done = FALSE;
+			}
+		}
+		break;
+
 	case RSPAMD_TASK_STAGE_PRE_FILTERS:
 		/* Check for prefilters */
 		saved_priority = G_MININT;
diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h
index c220b1ccc..67c753e39 100644
--- a/src/libserver/rspamd_symcache.h
+++ b/src/libserver/rspamd_symcache.h
@@ -48,10 +48,11 @@ enum rspamd_symbol_type {
 	SYMBOL_TYPE_CLASSIFIER = (1u << 6u),
 	SYMBOL_TYPE_FINE = (1u << 7u),
 	SYMBOL_TYPE_EMPTY = (1u << 8u), /* Allow execution on empty tasks */
-	SYMBOL_TYPE_PREFILTER = (1u << 9u),
-	SYMBOL_TYPE_POSTFILTER = (1u << 10u),
-	SYMBOL_TYPE_NOSTAT = (1u << 11u), /* Skip as statistical symbol */
-	SYMBOL_TYPE_IDEMPOTENT = (1u << 12u), /* Symbol cannot change metric */
+	SYMBOL_TYPE_CONNFILTER = (1u << 9u), /* Connection stage filter */
+	SYMBOL_TYPE_PREFILTER = (1u << 10u),
+	SYMBOL_TYPE_POSTFILTER = (1u << 11u),
+	SYMBOL_TYPE_NOSTAT = (1u << 12u), /* Skip as statistical symbol */
+	SYMBOL_TYPE_IDEMPOTENT = (1u << 13u), /* Symbol cannot change metric */
 	SYMBOL_TYPE_TRIVIAL = (1u << 14u), /* Symbol is trivial */
 	SYMBOL_TYPE_MIME_ONLY = (1u << 15u), /* Symbol is mime only */
 	SYMBOL_TYPE_EXPLICIT_DISABLE = (1u << 16u), /* Symbol should be disabled explicitly only */
diff --git a/src/libserver/task.c b/src/libserver/task.c
index 6b93ac810..e7a83a603 100644
--- a/src/libserver/task.c
+++ b/src/libserver/task.c
@@ -727,6 +727,7 @@ rspamd_task_process (struct rspamd_task *task, guint stages)
 		}
 		break;
 
+	case RSPAMD_TASK_STAGE_CONNFILTERS:
 	case RSPAMD_TASK_STAGE_PRE_FILTERS:
 	case RSPAMD_TASK_STAGE_FILTERS:
 		all_done = rspamd_symcache_process_symbols (task, task->cfg->cache, st);
@@ -1806,8 +1807,8 @@ rspamd_task_stage_name (enum rspamd_task_stage stg)
 	case RSPAMD_TASK_STAGE_CONNECT:
 		ret = "connect";
 		break;
-	case RSPAMD_TASK_STAGE_ENVELOPE:
-		ret = "envelope";
+	case RSPAMD_TASK_STAGE_CONNFILTERS:
+		ret = "connection_filter";
 		break;
 	case RSPAMD_TASK_STAGE_READ_MESSAGE:
 		ret = "read_message";
diff --git a/src/libserver/task.h b/src/libserver/task.h
index 0e23ea55d..ca49ed1e0 100644
--- a/src/libserver/task.h
+++ b/src/libserver/task.h
@@ -40,7 +40,7 @@ enum rspamd_command {
 
 enum rspamd_task_stage {
 	RSPAMD_TASK_STAGE_CONNECT = (1u << 0u),
-	RSPAMD_TASK_STAGE_ENVELOPE = (1u << 1u),
+	RSPAMD_TASK_STAGE_CONNFILTERS = (1u << 1u),
 	RSPAMD_TASK_STAGE_READ_MESSAGE = (1u << 2u),
 	RSPAMD_TASK_STAGE_PROCESS_MESSAGE = (1u << 3u),
 	RSPAMD_TASK_STAGE_PRE_FILTERS = (1u << 4u),
@@ -60,7 +60,7 @@ enum rspamd_task_stage {
 };
 
 #define RSPAMD_TASK_PROCESS_ALL (RSPAMD_TASK_STAGE_CONNECT | \
-        RSPAMD_TASK_STAGE_ENVELOPE | \
+        RSPAMD_TASK_STAGE_CONNFILTERS | \
         RSPAMD_TASK_STAGE_READ_MESSAGE | \
         RSPAMD_TASK_STAGE_PRE_FILTERS | \
         RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \
@@ -77,7 +77,6 @@ enum rspamd_task_stage {
         RSPAMD_TASK_STAGE_IDEMPOTENT | \
         RSPAMD_TASK_STAGE_DONE)
 #define RSPAMD_TASK_PROCESS_LEARN (RSPAMD_TASK_STAGE_CONNECT | \
-        RSPAMD_TASK_STAGE_ENVELOPE | \
         RSPAMD_TASK_STAGE_READ_MESSAGE | \
         RSPAMD_TASK_STAGE_PROCESS_MESSAGE | \
         RSPAMD_TASK_STAGE_CLASSIFIERS_PRE | \


More information about the Commits mailing list