summaryrefslogtreecommitdiffstats
path: root/src/libserver/rspamd_symcache.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2020-10-19 15:14:58 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2020-10-19 15:14:58 +0100
commitb87eb86a42e7d450a71e4b73b4910649b2d34c4e (patch)
tree71513eb3c2ce36dffe939ec68ebd617ec3877e3c /src/libserver/rspamd_symcache.c
parent7604819ab9e65d0177ab35888c49ec791b98b649 (diff)
downloadrspamd-b87eb86a42e7d450a71e4b73b4910649b2d34c4e.tar.gz
rspamd-b87eb86a42e7d450a71e4b73b4910649b2d34c4e.zip
[Project] Ressurect empty prefilters as connection filters
Diffstat (limited to 'src/libserver/rspamd_symcache.c')
-rw-r--r--src/libserver/rspamd_symcache.c59
1 files changed, 56 insertions, 3 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;