summaryrefslogtreecommitdiff
path: root/fail2ban/helpers.py
diff options
context:
space:
mode:
authorsebres <serg.brester@sebres.de>2020-08-26 12:05:20 +0200
committersebres <serg.brester@sebres.de>2020-08-26 12:05:20 +0200
commit5a2cc4e1c5219645ca801c8ba90bab5c609340ec (patch)
tree77f0b5874ef164bf8873b7cfccbc9e585fe72d42 /fail2ban/helpers.py
parent81fb28e1464ea953cfd72011df7b7a89ad6ad495 (diff)
downloadfail2ban-5a2cc4e1c5219645ca801c8ba90bab5c609340ec.tar.gz
substituteRecursiveTags: more precise self- or cyclic-recursion prevention (don't clear replacement counts of tags, rather consider replacement count by tax X in tag Y)
Diffstat (limited to 'fail2ban/helpers.py')
-rw-r--r--fail2ban/helpers.py14
1 files changed, 8 insertions, 6 deletions
diff --git a/fail2ban/helpers.py b/fail2ban/helpers.py
index 3ef7d543..dc7852ae 100644
--- a/fail2ban/helpers.py
+++ b/fail2ban/helpers.py
@@ -398,8 +398,8 @@ def splitWithOptions(option):
# tags (<tag>) in tagged options.
#
-# max tag replacement count:
-MAX_TAG_REPLACE_COUNT = 10
+# max tag replacement count (considering tag X in tag Y repeat):
+MAX_TAG_REPLACE_COUNT = 25
# compiled RE for tag name (replacement name)
TAG_CRE = re.compile(r'<([^ <>]+)>')
@@ -433,6 +433,7 @@ def substituteRecursiveTags(inptags, conditional='',
done = set()
noRecRepl = hasattr(tags, "getRawItem")
# repeat substitution while embedded-recursive (repFlag is True)
+ repCounts = {}
while True:
repFlag = False
# substitute each value:
@@ -444,7 +445,7 @@ def substituteRecursiveTags(inptags, conditional='',
value = orgval = uni_string(tags[tag])
# search and replace all tags within value, that can be interpolated using other tags:
m = tre_search(value)
- refCounts = {}
+ rplc = repCounts.get(tag, {})
#logSys.log(5, 'TAG: %s, value: %s' % (tag, value))
while m:
# found replacement tag:
@@ -454,13 +455,13 @@ def substituteRecursiveTags(inptags, conditional='',
m = tre_search(value, m.end())
continue
#logSys.log(5, 'found: %s' % rtag)
- if rtag == tag or refCounts.get(rtag, 1) > MAX_TAG_REPLACE_COUNT:
+ if rtag == tag or rplc.get(rtag, 1) > MAX_TAG_REPLACE_COUNT:
# recursive definitions are bad
#logSys.log(5, 'recursion fail tag: %s value: %s' % (tag, value) )
raise ValueError(
"properties contain self referencing definitions "
"and cannot be resolved, fail tag: %s, found: %s in %s, value: %s" %
- (tag, rtag, refCounts, value))
+ (tag, rtag, rplc, value))
repl = None
if conditional:
repl = tags.get(rtag + '?' + conditional)
@@ -480,7 +481,7 @@ def substituteRecursiveTags(inptags, conditional='',
value = value.replace('<%s>' % rtag, repl)
#logSys.log(5, 'value now: %s' % value)
# increment reference count:
- refCounts[rtag] = refCounts.get(rtag, 0) + 1
+ rplc[rtag] = rplc.get(rtag, 0) + 1
# the next match for replace:
m = tre_search(value, m.start())
#logSys.log(5, 'TAG: %s, newvalue: %s' % (tag, value))
@@ -488,6 +489,7 @@ def substituteRecursiveTags(inptags, conditional='',
if orgval != value:
# check still contains any tag - should be repeated (possible embedded-recursive substitution):
if tre_search(value):
+ repCounts[tag] = rplc
repFlag = True
# copy return tags dict to prevent modifying of inptags:
if id(tags) == id(inptags):