commit cc206f2: [Fix] Plug memory leak in http settings reload

Vsevolod Stakhov vsevolod at highsecure.ru
Thu Sep 2 10:35:04 UTC 2021


Author: Vsevolod Stakhov
Date: 2021-09-02 11:28:19 +0100
URL: https://github.com/rspamd/rspamd/commit/cc206f252c468fa3ecc339d3fe939234e90adc8c (HEAD -> master)

[Fix] Plug memory leak in http settings reload
Reverts: d9180d3ac0fac6d0aa12cd33117cb7efc731e2a2

---
 src/plugins/lua/settings.lua | 26 +++++++++++++++++++++-----
 1 file changed, 21 insertions(+), 5 deletions(-)

diff --git a/src/plugins/lua/settings.lua b/src/plugins/lua/settings.lua
index bb0ec6f76..831eb1bea 100644
--- a/src/plugins/lua/settings.lua
+++ b/src/plugins/lua/settings.lua
@@ -31,6 +31,7 @@ local lua_selectors = require "lua_selectors"
 local lua_settings = require "lua_settings"
 local ucl = require "ucl"
 local fun = require "fun"
+local rspamd_mempool = require "rspamd_mempool"
 
 local redis_params
 
@@ -586,7 +587,7 @@ local function gen_check_closure(expected, check_func)
 end
 
 -- Process settings based on their priority
-local function process_settings_table(tbl, allow_ids, is_static)
+local function process_settings_table(tbl, allow_ids, mempool, is_static)
 
   -- Check the setting element internal data
   local process_setting_elt = function(name, elt)
@@ -976,7 +977,7 @@ local function process_settings_table(tbl, allow_ids, is_static)
 
       local rspamd_expression = require "rspamd_expression"
       out.expression = rspamd_expression.create(elt.expression, parse_atom,
-          rspamd_config:get_mempool())
+          mempool)
       out.checks = checks
 
       if not out.expression then
@@ -1094,6 +1095,7 @@ local function process_settings_table(tbl, allow_ids, is_static)
 end
 
 -- Parse settings map from the ucl line
+local settings_map_pool
 local function process_settings_map(map_text)
   local parser = ucl.parser()
   local res,err
@@ -1107,11 +1109,18 @@ local function process_settings_map(map_text)
   if not res then
     rspamd_logger.warnx(rspamd_config, 'cannot parse settings map: ' .. err)
   else
+    if settings_map_pool then
+      settings_map_pool:destroy()
+    end
+
+    settings_map_pool = rspamd_mempool.create()
     local obj = parser:get_object()
     if obj['settings'] then
-      process_settings_table(obj['settings'], false, false)
+      process_settings_table(obj['settings'], false,
+          settings_map_pool, false)
     else
-      process_settings_table(obj, false, false)
+      process_settings_table(obj, false, settings_map_pool,
+          false)
     end
   end
 
@@ -1231,6 +1240,7 @@ if set_section and set_section[1] and type(set_section[1]) == "string" then
     rspamd_logger.errx(rspamd_config, 'cannot load settings from %1', set_section)
   end
 elseif set_section and type(set_section) == "table" then
+  settings_map_pool = rspamd_mempool.create()
   -- We need to check this table and register static symbols first
   -- Postponed settings init is needed to ensure that all symbols have been
   -- registered BEFORE settings plugin. Otherwise, we can have inconsistent settings expressions
@@ -1261,6 +1271,12 @@ elseif set_section and type(set_section) == "table" then
           end, set_section)
   )
   rspamd_config:add_post_init(function ()
-    process_settings_table(set_section, true, true)
+    process_settings_table(set_section, true, settings_map_pool, true)
   end, 100)
 end
+
+rspamd_config:add_config_unload(function()
+  if settings_map_pool then
+    settings_map_pool:destroy()
+  end
+end)


More information about the Commits mailing list