From ab7109a335ee165f7a28949e165be529c4efcec1 Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Tue, 2 Jun 2015 15:36:27 -0400 Subject: [PATCH 1/2] Raise a Liquid::ArgumentError in slice filter for invalid integers. --- lib/liquid/standardfilters.rb | 14 ++++++++++++-- test/integration/standard_filter_test.rb | 6 ++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index a615b46..0fff4db 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -46,8 +46,8 @@ module Liquid end def slice(input, offset, length = nil) - offset = Integer(offset) - length = length ? Integer(length) : 1 + offset = to_integer(offset) + length = length ? to_integer(length) : 1 if input.is_a?(Array) input.slice(offset, length) || [] @@ -317,6 +317,16 @@ module Liquid private + def to_integer(num) + return num if num.is_a?(Integer) + num = num.to_s + begin + Integer(num) + rescue ::ArgumentError + raise Liquid::ArgumentError, "invalid integer '#{num}'" + end + end + def to_number(obj) case obj when Float diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index c168061..39e6013 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -76,6 +76,12 @@ class StandardFiltersTest < Minitest::Test assert_equal '', @filters.slice(nil, 0) assert_equal '', @filters.slice('foobar', 100, 10) assert_equal '', @filters.slice('foobar', -100, 10) + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', nil) + end + assert_raises(Liquid::ArgumentError) do + @filters.slice('foobar', 0, "") + end end def test_slice_on_arrays From c84f4520ccd4021b2cb6468b143af87b9bb2248c Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Wed, 3 Jun 2015 01:35:01 -0400 Subject: [PATCH 2/2] Keep input out of error message and add test for slice Integer parsing. --- lib/liquid/standardfilters.rb | 2 +- test/integration/standard_filter_test.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index 0fff4db..d6cbb97 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -323,7 +323,7 @@ module Liquid begin Integer(num) rescue ::ArgumentError - raise Liquid::ArgumentError, "invalid integer '#{num}'" + raise Liquid::ArgumentError, "invalid integer" end end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 39e6013..4d8ae5b 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -76,6 +76,7 @@ class StandardFiltersTest < Minitest::Test assert_equal '', @filters.slice(nil, 0) assert_equal '', @filters.slice('foobar', 100, 10) assert_equal '', @filters.slice('foobar', -100, 10) + assert_equal 'oob', @filters.slice('foobar', '1', '3') assert_raises(Liquid::ArgumentError) do @filters.slice('foobar', nil) end