]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix external dependencies for SA module
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Tue, 29 Nov 2016 11:13:04 +0000 (11:13 +0000)
committerAndrew Lewis <nerf@judo.za.org>
Tue, 29 Nov 2016 12:00:54 +0000 (14:00 +0200)
Conflicts:
src/plugins/lua/spamassassin.lua

src/plugins/lua/spamassassin.lua

index cf17aa2476d1e02bc10437ca228dcc6b684dbe24..a88326edb580275a06de910d23a47bc72970ef91 100644 (file)
@@ -1463,15 +1463,18 @@ local function post_process()
 
         for i,a in ipairs(expr_atoms) do
           if not atoms[a] then
-            local rspamd_symbol, replaced_symbol = replace_symbol(a)
-            rspamd_logger.debugx('atom %1 is a direct foreign dependency, ' ..
-              'register dependency for %2 on %3',
-              a, k, rspamd_symbol)
-            rspamd_config:register_dependency(k, rspamd_symbol)
+            local rspamd_symbol = replace_symbol(a)
             if not external_deps[k] then
-              external_deps[k] = {rspamd_symbol}
-            else
-              table.insert(external_deps[k], rspamd_symbol)
+              external_deps[k] = {}
+            end
+
+            if not external_deps[k][rspamd_symbol] then
+              rspamd_config:register_dependency(k, rspamd_symbol)
+              external_deps[k][rspamd_symbol] = true
+              rspamd_logger.debugx(rspamd_config,
+                'atom %1 is a direct foreign dependency, ' ..
+                'register dependency for %2 on %3',
+                a, k, rspamd_symbol)
             end
           end
         end
@@ -1483,16 +1486,27 @@ local function post_process()
     rules))
 
   -- ... And then indirect ones ...
-  each(function(k, r)
+  local nchanges
+  repeat
+  nchanges = 0
+    each(function(k, r)
       if r['expression'] then
         local expr_atoms = r['expression']:atoms()
         for i,a in ipairs(expr_atoms) do
           if type(external_deps[a]) == 'table' then
             for _,dep in ipairs(external_deps[a]) do
-              rspamd_logger.debugx('atom %1 holds a foreign dependency, ' ..
-                'register dependency for %2 on %3',
-                a, k, dep);
+              if not external_deps[k] then
+                external_deps[k] = {}
+              end
+              if not external_deps[k][dep] then
                 rspamd_config:register_dependency(k, dep)
+                external_deps[k][dep] = true
+                rspamd_logger.debugx(rspamd_config,
+                  'atom %1 is a direct foreign dependency, ' ..
+                  'register dependency for %2 on %3',
+                  a, k, dep)
+              end
+              nchanges = nchanges + 1
             end
           else
             local rspamd_symbol, replaced_symbol = replace_symbol(a)
@@ -1509,6 +1523,7 @@ local function post_process()
       return r['type'] == 'meta'
     end,
     rules))
+  until nchanges ~= 0
 
   -- Set missing symbols
   each(function(key, score)