From: Vsevolod Stakhov Date: Tue, 8 Dec 2020 14:47:53 +0000 (+0000) Subject: [Minor] Store composite status in the composite atom X-Git-Tag: 2.7~87 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=a0223f6333bb55428c6369f857d354c956a58a01;p=rspamd.git [Minor] Store composite status in the composite atom --- diff --git a/src/libserver/composites.c b/src/libserver/composites.c index 7a5289441..926d3fd2c 100644 --- a/src/libserver/composites.c +++ b/src/libserver/composites.c @@ -66,6 +66,13 @@ struct rspamd_composite_option_match { struct rspamd_composite_atom { gchar *symbol; + enum { + ATOM_UNKNOWN, + ATOM_COMPOSITE, + ATOM_PLAIN + } comp_type; + + struct rspamd_composite *ncomp; /* underlying composite */ struct rspamd_composite_option_match *opts; }; @@ -217,6 +224,7 @@ rspamd_composite_expr_parse (const gchar *line, gsize len, state = comp_state_read_symbol; atom = rspamd_mempool_alloc0 (pool, sizeof (*atom)); + atom->comp_type = ATOM_UNKNOWN; res = rspamd_mempool_alloc0 (pool, sizeof (*res)); res->len = clen; res->str = line; @@ -383,20 +391,31 @@ rspamd_composite_process_single_symbol (struct composites_data *cd, { struct rspamd_symbol_result *ms = NULL; gdouble rc = 0; - struct rspamd_composite *ncomp; struct rspamd_task *task = cd->task; if ((ms = rspamd_task_find_symbol_result (cd->task, sym, cd->metric_res)) == NULL) { msg_debug_composites ("not found symbol %s in composite %s", sym, cd->composite->sym); - if ((ncomp = - g_hash_table_lookup (cd->task->cfg->composite_symbols, - sym)) != NULL) { + if (atom->comp_type == ATOM_UNKNOWN) { + struct rspamd_composite *ncomp; + + if ((ncomp = + g_hash_table_lookup (cd->task->cfg->composite_symbols, + sym)) != NULL) { + atom->comp_type = ATOM_COMPOSITE; + atom->ncomp = ncomp; + } + else { + atom->comp_type = ATOM_PLAIN; + } + } + + if (atom->comp_type == ATOM_COMPOSITE) { msg_debug_composites ("symbol %s for composite %s is another composite", sym, cd->composite->sym); - if (isclr (cd->checked, ncomp->id * 2)) { + if (isclr (cd->checked, atom->ncomp->id * 2)) { struct rspamd_composite *saved; msg_debug_composites ("composite dependency %s for %s is not checked", @@ -404,7 +423,7 @@ rspamd_composite_process_single_symbol (struct composites_data *cd, /* Set checked for this symbol to avoid cyclic references */ setbit (cd->checked, cd->composite->id * 2); saved = cd->composite; /* Save the current composite */ - composites_foreach_callback ((gpointer)ncomp->sym, ncomp, cd); + composites_foreach_callback ((gpointer)atom->ncomp->sym, atom->ncomp, cd); /* Restore state */ cd->composite = saved; @@ -417,7 +436,7 @@ rspamd_composite_process_single_symbol (struct composites_data *cd, /* * XXX: in case of cyclic references this would return 0 */ - if (isset (cd->checked, ncomp->id * 2 + 1)) { + if (isset (cd->checked, atom->ncomp->id * 2 + 1)) { ms = rspamd_task_find_symbol_result (cd->task, sym, cd->metric_res); }