From 2b40850e4a9c1fe807982d1f9abda794880f6384 Mon Sep 17 00:00:00 2001 From: Michael Go Date: Wed, 1 Feb 2023 19:52:30 -0400 Subject: [PATCH] fix variable lookup parse timing out with missing closing bracket --- lib/liquid.rb | 2 +- test/integration/variable_test.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/liquid.rb b/lib/liquid.rb index 09b0dd80..eba84e14 100644 --- a/lib/liquid.rb +++ b/lib/liquid.rb @@ -41,7 +41,7 @@ module Liquid AnyStartingTag = /#{TagStart}|#{VariableStart}/o PartialTemplateParser = /#{TagStart}.*?#{TagEnd}|#{VariableStart}.*?#{VariableIncompleteEnd}/om TemplateParser = /(#{PartialTemplateParser}|#{AnyStartingTag})/om - VariableParser = /\[(?:[^\[\]]+|\g<0>)*\]|#{VariableSegment}+\??/o + VariableParser = /\[(?>[^\[\]]+|\g<0>)*\]|#{VariableSegment}+\??/o RAISE_EXCEPTION_LAMBDA = ->(_e) { raise } diff --git a/test/integration/variable_test.rb b/test/integration/variable_test.rb index 0cb8bddc..0667adb9 100644 --- a/test/integration/variable_test.rb +++ b/test/integration/variable_test.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'test_helper' +require 'timeout' class VariableTest < Minitest::Test include Liquid @@ -169,4 +170,30 @@ class VariableTest < Minitest::Test } ) end + + def test_variable_lookup_should_not_hang_with_invalid_syntax + Timeout.timeout(1) do + assert_template_result( + 'bar', + "{{['foo'}}", + { + 'foo' => 'bar', + }, + error_mode: :lax, + ) + end + + very_long_key = "1234567890" * 100 + + Timeout.timeout(1) do + assert_template_result( + 'bar', + "{{['#{very_long_key}'}}", + { + very_long_key => 'bar', + }, + error_mode: :lax, + ) + end + end end