Use a loop to strictly parse binary comparisons to avoid recursion (#892)

Using recursion allows a malicious template to cause a SystemStackError
This commit is contained in:
Dylan Thacker-Smith
2017-05-10 10:41:52 -04:00
committed by GitHub
parent 8928454e29
commit 62d4625468
+8 -5
View File
@@ -83,17 +83,20 @@ module Liquid
def strict_parse(markup) def strict_parse(markup)
p = Parser.new(markup) p = Parser.new(markup)
condition = parse_binary_comparison(p) condition = parse_binary_comparisons(p)
p.consume(:end_of_string) p.consume(:end_of_string)
condition condition
end end
def parse_binary_comparison(p) def parse_binary_comparisons(p)
condition = parse_comparison(p) condition = parse_comparison(p)
if op = (p.id?('and'.freeze) || p.id?('or'.freeze)) first_condition = condition
condition.send(op, parse_binary_comparison(p)) while op = (p.id?('and'.freeze) || p.id?('or'.freeze))
child_condition = parse_comparison(p)
condition.send(op, child_condition)
condition = child_condition
end end
condition first_condition
end end
def parse_comparison(p) def parse_comparison(p)