From dc2447bb6f940a72aedf9761598470f24a822d79 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 29 May 2020 15:18:55 +0100 Subject: [PATCH] [Minor] Some fixes to allow empty symbols_enabled/disabled --- src/libserver/rspamd_symcache.c | 10 ++++------ src/lua/lua_config.c | 28 ++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c index 0bd68fca6..624d1c382 100644 --- a/src/libserver/rspamd_symcache.c +++ b/src/libserver/rspamd_symcache.c @@ -3531,10 +3531,8 @@ rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache, return item->allowed_ids.dyn.n; } else { - while (item->forbidden_ids.st[cnt] != 0) { + while (item->forbidden_ids.st[cnt] != 0 && cnt < G_N_ELEMENTS (item->allowed_ids.st)) { cnt ++; - - g_assert (cnt < G_N_ELEMENTS (item->allowed_ids.st)); } *nids = cnt; @@ -3543,7 +3541,7 @@ rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache, } } -/* Usable for near-sorted ids list */ +/* Insertion sort: usable for near-sorted ids list */ static inline void rspamd_ids_insertion_sort (guint *a, guint n) { @@ -3571,7 +3569,7 @@ rspamd_symcache_add_id_to_list (rspamd_mempool_t *pool, if (ls->st[0] == -1) { /* Dynamic array */ if (ls->dyn.len < ls->dyn.allocated) { - /* Trivial, append + qsort */ + /* Trivial, append + sort */ ls->dyn.n[ls->dyn.len++] = id; } else { @@ -3590,7 +3588,7 @@ rspamd_symcache_add_id_to_list (rspamd_mempool_t *pool, } else { /* Static part */ - while (ls->st[cnt] != 0) { + while (ls->st[cnt] != 0 && cnt < G_N_ELEMENTS (ls->st)) { cnt ++; } diff --git a/src/lua/lua_config.c b/src/lua/lua_config.c index cfeb6e68d..a605f2fac 100644 --- a/src/lua/lua_config.c +++ b/src/lua/lua_config.c @@ -3796,6 +3796,30 @@ lua_config_register_finish_script (lua_State *L) return 0; } +static inline bool +rspamd_lua_config_check_settings_symbols_object (const ucl_object_t *obj) +{ + if (obj == NULL) { + /* Semantically valid */ + return true; + } + + if (ucl_object_type (obj) == UCL_OBJECT) { + /* Key-value mapping - should be okay */ + return true; + } + + if (ucl_object_type (obj) == UCL_ARRAY) { + /* Okay if empty */ + if (obj->len == 0) { + return true; + } + } + + /* Everything else not okay */ + return false; +} + static gint lua_config_register_settings_id (lua_State *L) { @@ -3809,7 +3833,7 @@ lua_config_register_settings_id (lua_State *L) sym_enabled = ucl_object_lua_import (L, 3); - if (sym_enabled != NULL && ucl_object_type (sym_enabled) != UCL_OBJECT) { + if (!rspamd_lua_config_check_settings_symbols_object (sym_enabled)) { ucl_object_unref (sym_enabled); return luaL_error (L, "invalid symbols enabled"); @@ -3817,7 +3841,7 @@ lua_config_register_settings_id (lua_State *L) sym_disabled = ucl_object_lua_import (L, 4); - if (sym_disabled != NULL && ucl_object_type (sym_disabled) != UCL_OBJECT) { + if (!rspamd_lua_config_check_settings_symbols_object (sym_disabled)) { ucl_object_unref (sym_enabled); ucl_object_unref (sym_disabled); -- 2.39.5