diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-07-05 15:36:53 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2018-07-05 15:36:53 +0100 |
commit | 6716825ffde68dae6969db1f7a30c2c9b105c678 (patch) | |
tree | 718b4749cca6873b021f661bcf09ccb9402a0dea | |
parent | 6da545d4a7a7a7936511408e0ac738c9f7ab9587 (diff) | |
download | rspamd-6716825ffde68dae6969db1f7a30c2c9b105c678.tar.gz rspamd-6716825ffde68dae6969db1f7a30c2c9b105c678.zip |
[Fix] Fix DKIM check rule if DNS is unavailable
-rw-r--r-- | lualib/lua_squeeze_rules.lua | 5 | ||||
-rw-r--r-- | src/plugins/dkim_check.c | 49 |
2 files changed, 33 insertions, 21 deletions
diff --git a/lualib/lua_squeeze_rules.lua b/lualib/lua_squeeze_rules.lua index a6e420fbd..9c751a33a 100644 --- a/lualib/lua_squeeze_rules.lua +++ b/lualib/lua_squeeze_rules.lua @@ -36,6 +36,8 @@ local function gen_lua_squeeze_function(order) return {data[1](task)} end + -- Too expensive to call :( + --logger.debugm(SN, task, 'call for: %s', data[2]) local status, ret = pcall(real_call) if not status then @@ -256,7 +258,8 @@ exports.squeeze_init = function() -- and create squeezed rules for k,v in pairs(squeezed_symbols) do local parent_symbol = get_ordered_symbol_name(v.order) - logger.debugm(SN, rspamd_config, 'added squeezed rule: %s (%s)', k, parent_symbol) + logger.debugm(SN, rspamd_config, 'added squeezed rule: %s (%s): %s', + k, parent_symbol, v) rspamd_config:register_symbol{ type = 'virtual', name = k, diff --git a/src/plugins/dkim_check.c b/src/plugins/dkim_check.c index ba2d9e2e3..7a8fea273 100644 --- a/src/plugins/dkim_check.c +++ b/src/plugins/dkim_check.c @@ -85,7 +85,8 @@ struct dkim_check_result { rspamd_dkim_key_t *key; struct rspamd_task *task; gint res; - gint mult_allow, mult_deny; + gdouble mult_allow; + gdouble mult_deny; struct rspamd_async_watcher *w; struct dkim_check_result *next, *prev, *first; }; @@ -888,17 +889,27 @@ dkim_module_reconfig (struct rspamd_config *cfg) * Parse strict value for domain in format: 'reject_multiplier:deny_multiplier' */ static gboolean -dkim_module_parse_strict (const gchar *value, gint *allow, gint *deny) +dkim_module_parse_strict (const gchar *value, gdouble *allow, gdouble *deny) { const gchar *colon; - gulong val; + gchar *err = NULL; + gdouble val; + gchar numbuf[64]; colon = strchr (value, ':'); if (colon) { - if (rspamd_strtoul (value, colon - value, &val)) { + rspamd_strlcpy (numbuf, value, + MIN (sizeof (numbuf), (colon - value) + 1)); + val = strtod (numbuf, &err); + + if (err == NULL || *err == '\0') { *deny = val; colon++; - if (rspamd_strtoul (colon, strlen (colon), &val)) { + rspamd_strlcpy (numbuf, colon, sizeof (numbuf)); + err = NULL; + val = strtod (numbuf, &err); + + if (err == NULL || *err == '\0') { *allow = val; return TRUE; } @@ -952,7 +963,7 @@ dkim_module_check (struct dkim_check_result *res) if (all_done) { DL_FOREACH (first, cur) { const gchar *symbol = NULL, *trace = NULL; - int symbol_weight = 1; + gdouble symbol_weight = 1.0; if (cur->ctx == NULL) { continue; @@ -1103,19 +1114,9 @@ dkim_symbol_callback (struct rspamd_task *task, void *unused) continue; } - if (res == NULL) { - res = rspamd_mempool_alloc0 (task->task_pool, sizeof (*res)); - res->prev = res; - res->w = rspamd_session_get_watcher (task->s); - cur = res; - } - else { - cur = rspamd_mempool_alloc0 (task->task_pool, sizeof (*res)); - } - + cur = rspamd_mempool_alloc0 (task->task_pool, sizeof (*cur)); cur->first = res; cur->res = -1; - cur->w = res->w; cur->task = task; cur->mult_allow = 1.0; cur->mult_deny = 1.0; @@ -1167,14 +1168,22 @@ dkim_symbol_callback (struct rspamd_task *task, void *unused) dkim_module_key_dtor, cur->key); } else { - rspamd_get_dkim_key (ctx, + if (!rspamd_get_dkim_key (ctx, task, dkim_module_key_handler, - cur); + cur)) { + continue; + } } } - if (res != cur) { + if (res == NULL) { + res = cur; + res->prev = res; + res->w = rspamd_session_get_watcher (task->s); + } + else { + cur->w = res->w; DL_APPEND (res, cur); } |