From 5f96c4a88046c40ed2a6d20a6aa2ece5c23fc549 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 10 Nov 2018 17:15:44 +0000 Subject: [PATCH] [Minor] Don't learn classifiers where expansion fails --- src/libstat/backends/redis_backend.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libstat/backends/redis_backend.c b/src/libstat/backends/redis_backend.c index b63b9bc36d..9e6c5f46b0 100644 --- a/src/libstat/backends/redis_backend.c +++ b/src/libstat/backends/redis_backend.c @@ -136,6 +136,7 @@ rspamd_redis_expand_object (const gchar *pattern, GString *tb; const gchar *rcpt = NULL; gint err_idx; + gboolean expansion_errored = FALSE; g_assert (ctx != NULL); stcf = ctx->stcf; @@ -198,6 +199,9 @@ rspamd_redis_expand_object (const gchar *pattern, if (elt) { tlen += strlen (elt); } + else { + expansion_errored = TRUE; + } break; case 'r': @@ -211,11 +215,15 @@ rspamd_redis_expand_object (const gchar *pattern, if (elt) { tlen += strlen (elt); } + else { + expansion_errored = TRUE; + } break; case 'l': if (stcf->label) { tlen += strlen (stcf->label); } + /* Label miss is OK */ break; case 's': if (ctx->new_schema) { @@ -253,7 +261,8 @@ rspamd_redis_expand_object (const gchar *pattern, } } - if (target == NULL || task == NULL) { + + if (target == NULL || task == NULL || expansion_errored) { return tlen; } @@ -1495,6 +1504,7 @@ rspamd_redis_runtime (struct rspamd_task *task, struct redis_stat_ctx *ctx = REDIS_CTX (c); struct redis_stat_runtime *rt; struct upstream *up; + char *object_expanded = NULL; rspamd_inet_addr_t *addr; g_assert (ctx != NULL); @@ -1523,15 +1533,22 @@ rspamd_redis_runtime (struct rspamd_task *task, return NULL; } + if (rspamd_redis_expand_object (ctx->redis_object, ctx, task, + &object_expanded) == 0) { + msg_err_task ("expansion for learning failed for symbol %s " + "(maybe learning per user classifier with no user or recipient)", + stcf->symbol); + return NULL; + } + rt = rspamd_mempool_alloc0 (task->task_pool, sizeof (*rt)); rspamd_mempool_add_destructor (task->task_pool, rspamd_gerror_free_maybe, &rt->err); - rspamd_redis_expand_object (ctx->redis_object, ctx, task, - &rt->redis_object_expanded); rt->selected = up; rt->task = task; rt->ctx = ctx; rt->stcf = stcf; + rt->redis_object_expanded = object_expanded; addr = rspamd_upstream_addr (up); g_assert (addr != NULL); -- 2.47.3