mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-20 11:20:41 -07:00
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:
committed by
GitHub
parent
8928454e29
commit
62d4625468
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user