From 2b17e24b16fdbeb887d37e4403993321965a7212 Mon Sep 17 00:00:00 2001 From: Florian Weingarten Date: Fri, 31 May 2013 09:34:23 -0400 Subject: [PATCH] Mutate resource_limits hash to flag that the limit was reached (for outside observation) --- lib/liquid/block.rb | 5 ++++- test/liquid/template_test.rb | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/liquid/block.rb b/lib/liquid/block.rb index efd149be..a0a07e49 100644 --- a/lib/liquid/block.rb +++ b/lib/liquid/block.rb @@ -108,7 +108,10 @@ module Liquid token_output = (token.respond_to?(:render) ? token.render(context) : token) context.resource_limits[:render_length_current] += (token_output.respond_to?(:length) ? token_output.length : 1) - raise MemoryError.new("Memory limits exceeded") if context.resource_limits_reached? + if context.resource_limits_reached? + context.resource_limits[:reached] = true + raise MemoryError.new("Memory limits exceeded") + end output << token_output rescue MemoryError => e raise e diff --git a/test/liquid/template_test.rb b/test/liquid/template_test.rb index bc1c9a32..9a04e884 100644 --- a/test/liquid/template_test.rb +++ b/test/liquid/template_test.rb @@ -76,6 +76,7 @@ class TemplateTest < Test::Unit::TestCase t = Template.parse("0123456789") t.resource_limits = { :render_length_limit => 5 } assert_equal "Liquid error: Memory limits exceeded", t.render() + assert t.resource_limits[:reached] t.resource_limits = { :render_length_limit => 10 } assert_equal "0123456789", t.render() assert_not_nil t.resource_limits[:render_length_current] @@ -85,9 +86,11 @@ class TemplateTest < Test::Unit::TestCase t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}") t.resource_limits = { :render_score_limit => 50 } assert_equal "Liquid error: Memory limits exceeded", t.render() + assert t.resource_limits[:reached] t = Template.parse("{% for a in (1..100) %} foo {% endfor %}") t.resource_limits = { :render_score_limit => 50 } assert_equal "Liquid error: Memory limits exceeded", t.render() + assert t.resource_limits[:reached] t.resource_limits = { :render_score_limit => 200 } assert_equal (" foo " * 100), t.render() assert_not_nil t.resource_limits[:render_score_current] @@ -97,6 +100,7 @@ class TemplateTest < Test::Unit::TestCase t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}") t.resource_limits = { :assign_score_limit => 1 } assert_equal "Liquid error: Memory limits exceeded", t.render() + assert t.resource_limits[:reached] t.resource_limits = { :assign_score_limit => 2 } assert_equal "", t.render() assert_not_nil t.resource_limits[:assign_score_current] @@ -106,5 +110,6 @@ class TemplateTest < Test::Unit::TestCase t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}") t.resource_limits = { :render_score_limit => 50 } assert_equal "Liquid error: Memory limits exceeded", t.render() + assert t.resource_limits[:reached] end end # TemplateTest