]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Minor] Add more fail-safety checks to symbols execution
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 22 Oct 2018 13:10:04 +0000 (14:10 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 22 Oct 2018 13:10:04 +0000 (14:10 +0100)
src/libserver/symbols_cache.c

index 358242e94777a9eaccafaf7ca4e5c11a04d134aa..5c30135ff9e7d9db3ef316adccc0434af92af0f6 100644 (file)
 
 INIT_LOG_MODULE(symcache)
 
+#define CHECK_START_BIT(checkpoint, item) \
+       isset(checkpoint->processed_bits, item->id * 2)
+#define SET_START_BIT(checkpoint, item) \
+       setbit(checkpoint->processed_bits, item->id * 2)
+
+#define CHECK_FINISH_BIT(checkpoint, item) \
+       isset(checkpoint->processed_bits, item->id * 2 + 1)
+#define SET_FINISH_BIT(checkpoint, item) \
+       setbit(checkpoint->processed_bits, item->id * 2 + 1)
+
 static const guchar rspamd_symbols_cache_magic[8] = {'r', 's', 'c', 2, 0, 0, 0, 0 };
 
 static gint rspamd_symbols_cache_find_symbol_parent (struct symbols_cache *cache,
@@ -1304,9 +1314,9 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
        if (item->func) {
 
                g_assert (item->func != NULL);
-               g_assert (!isset (checkpoint->processed_bits, item->id * 2));
+               g_assert (!CHECK_START_BIT (checkpoint, item));
                /* Check has been started */
-               setbit (checkpoint->processed_bits, item->id * 2);
+               SET_START_BIT (checkpoint, item);
 
                if (!item->enabled ||
                                (RSPAMD_TASK_IS_EMPTY (task) && !(item->type & SYMBOL_TYPE_EMPTY))) {
@@ -1356,19 +1366,23 @@ rspamd_symbols_cache_check_symbol (struct rspamd_task *task,
                                return TRUE;
                        }
 
+                       if (item->async_events == 0 && !CHECK_FINISH_BIT (checkpoint, item)) {
+                               g_assert_not_reached ();
+                       }
+
                        return FALSE;
                }
                else {
                        msg_debug_cache_task ("skipping check of %s as its start condition is false",
                                        item->symbol);
-                       setbit (checkpoint->processed_bits, item->id * 2 + 1);
+                       SET_FINISH_BIT (checkpoint, item);
 
                        return TRUE;
                }
        }
        else {
-               setbit (checkpoint->processed_bits, item->id * 2);
-               setbit (checkpoint->processed_bits, item->id * 2 + 1);
+               SET_START_BIT (checkpoint, item);
+               SET_FINISH_BIT (checkpoint, item);
 
                return TRUE;
        }
@@ -1405,8 +1419,8 @@ rspamd_symbols_cache_check_deps (struct rspamd_task *task,
                                continue;
                        }
 
-                       if (!isset (checkpoint->processed_bits, dep->id * 2 + 1)) {
-                               if (!isset (checkpoint->processed_bits, dep->id * 2)) {
+                       if (!CHECK_FINISH_BIT (checkpoint, item)) {
+                               if (!SET_START_BIT (checkpoint, item)) {
                                        /* Not started */
                                        if (!check_only) {
                                                if (!rspamd_symbols_cache_check_deps (task, cache,
@@ -1650,8 +1664,8 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
                                return TRUE;
                        }
 
-                       if (!isset (checkpoint->processed_bits, item->id * 2) &&
-                                       !isset (checkpoint->processed_bits, item->id * 2 + 1)) {
+                       if (!CHECK_START_BIT (checkpoint, item) &&
+                                       !CHECK_FINISH_BIT (checkpoint, item)) {
                                /* Check priorities */
                                if (saved_priority == G_MININT) {
                                        saved_priority = item->priority;
@@ -1713,7 +1727,7 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
                                }
                        }
 
-                       if (!isset (checkpoint->processed_bits, item->id * 2)) {
+                       if (!CHECK_START_BIT (checkpoint, item)) {
                                all_done = FALSE;
 
                                if (!rspamd_symbols_cache_check_deps (task, cache, item,
@@ -1753,8 +1767,8 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
 
                        item = g_ptr_array_index (cache->postfilters, i);
 
-                       if (!isset (checkpoint->processed_bits, item->id * 2) &&
-                                       !isset (checkpoint->processed_bits, item->id * 2 + 1)) {
+                       if (!CHECK_START_BIT (checkpoint, item) &&
+                                       !CHECK_FINISH_BIT (checkpoint, item)) {
                                /* Check priorities */
                                all_done = FALSE;
 
@@ -1800,8 +1814,8 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
                for (i = 0; i < (gint)cache->idempotent->len; i ++) {
                        item = g_ptr_array_index (cache->idempotent, i);
 
-                       if (!isset (checkpoint->processed_bits, item->id * 2) &&
-                                       !isset (checkpoint->processed_bits, item->id * 2 + 1)) {
+                       if (!CHECK_START_BIT (checkpoint, item) &&
+                                       !CHECK_FINISH_BIT (checkpoint, item)) {
                                /* Check priorities */
                                if (saved_priority == G_MININT) {
                                        saved_priority = item->priority;
@@ -1830,7 +1844,7 @@ rspamd_symbols_cache_process_symbols (struct rspamd_task * task,
                for (i = 0; i < (gint)cache->idempotent->len; i ++) {
                        item = g_ptr_array_index (cache->idempotent, i);
 
-                       if (!isset (checkpoint->processed_bits, item->id * 2 + 1)) {
+                       if (!CHECK_FINISH_BIT (checkpoint, item)) {
                                all_done = FALSE;
                                break;
                        }
@@ -2273,8 +2287,8 @@ rspamd_symbols_cache_disable_symbol_checkpoint (struct rspamd_task *task,
                item = g_ptr_array_index (cache->items_by_id, id);
 
                if (!(item->type & SYMBOL_TYPE_SQUEEZED)) {
-                       setbit (checkpoint->processed_bits, item->id * 2);
-                       setbit (checkpoint->processed_bits, item->id * 2 + 1);
+                       SET_START_BIT (checkpoint, item);
+                       SET_FINISH_BIT (checkpoint, item);
 
                        msg_debug_cache_task ("disable execution of %s", symbol);
                }
@@ -2456,7 +2470,7 @@ rspamd_symbols_cache_is_symbol_enabled (struct rspamd_task *task,
        item = g_ptr_array_index (cache->items_by_id, id);
 
        if (checkpoint) {
-               if (isset (checkpoint->processed_bits, id * 2)) {
+               if (CHECK_START_BIT (checkpoint, item)) {
                        ret = FALSE;
                }
                else {
@@ -2502,6 +2516,10 @@ rspamd_symbols_cache_get_cur_item (struct rspamd_task *task)
 {
        struct cache_savepoint *checkpoint = task->checkpoint;
 
+       if (checkpoint == NULL) {
+               return NULL;
+       }
+
        return checkpoint->cur_item;
 }
 
@@ -2559,7 +2577,7 @@ rspamd_symbols_cache_finalize_item (struct rspamd_task *task,
        }
 
        msg_debug_cache_task ("process finalize for item %s", item->symbol);
-       setbit (checkpoint->processed_bits, item->id * 2 + 1);
+       SET_FINISH_BIT (checkpoint, item);
        checkpoint->items_inflight --;
        checkpoint->cur_item = NULL;
 
@@ -2591,7 +2609,7 @@ rspamd_symbols_cache_finalize_item (struct rspamd_task *task,
        /* Process all reverse dependencies */
        PTR_ARRAY_FOREACH (item->rdeps, i, rdep) {
                if (rdep->item) {
-                       if (!isset (checkpoint->processed_bits, rdep->item->id * 2)) {
+                       if (!CHECK_START_BIT (checkpoint, rdep->item)) {
                                if (!rspamd_symbols_cache_check_deps (task, task->cfg->cache,
                                                rdep->item,
                                                checkpoint, 0, FALSE)) {