Fix stack level too deep error

This commit is contained in:
Juan Broullon
2017-05-09 11:54:20 -04:00
parent 1370a102c9
commit 1707980a48
2 changed files with 17 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ module Liquid
# c.evaluate #=> true
#
class Condition #:nodoc:
@@depth = 0
@@operators = {
'=='.freeze => ->(cond, left, right) { cond.send(:equal_variables, left, right) },
'!='.freeze => ->(cond, left, right) { !cond.send(:equal_variables, left, right) },
@@ -47,6 +48,11 @@ module Liquid
when :or
result || @child_condition.evaluate(context)
when :and
@@depth += 1
if @@depth >= 500
@@depth = 0
raise StackLevelError, "Nesting too deep".freeze
end
result && @child_condition.evaluate(context)
else
result

View File

@@ -130,6 +130,17 @@ class ConditionUnitTest < Minitest::Test
assert_equal false, condition.evaluate
end
def test_maximum_recursion_depth
condition = Condition.new(1, '==', 1)
assert_raises(Liquid::StackLevelError) do
(1..510).each do
condition.evaluate
condition.and Condition.new(2, '==', 2)
end
end
end
def test_should_allow_custom_proc_operator
Condition.operators['starts_with'] = proc { |cond, left, right| left =~ %r{^#{right}} }