From cfe1637bdd1e0ac3b65cc6d57c8f37d04d76c4d6 Mon Sep 17 00:00:00 2001 From: Dylan Thacker-Smith Date: Tue, 20 Apr 2021 08:48:22 -0700 Subject: [PATCH] Translate RangeError to Liquid::Error for truncatewords with large int (#1431) --- .rubocop.yml | 3 +++ lib/liquid/standardfilters.rb | 9 ++++++++- test/integration/standard_filter_test.rb | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index defa1c7..e2ad80e 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -18,3 +18,6 @@ AllCops: Naming/MethodName: Exclude: - 'example/server/liquid_servlet.rb' + +Layout/BeginEndAlignment: + EnforcedStyleAlignWith: start_of_line diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb index cf92e68..150406a 100644 --- a/lib/liquid/standardfilters.rb +++ b/lib/liquid/standardfilters.rb @@ -5,6 +5,7 @@ require 'bigdecimal' module Liquid module StandardFilters + MAX_INT = (1 << 31) - 1 HTML_ESCAPE = { '&' => '&', '>' => '>', @@ -93,7 +94,13 @@ module Liquid words = Utils.to_integer(words) words = 1 if words <= 0 - wordlist = input.split(" ", words + 1) + wordlist = begin + input.split(" ", words + 1) + rescue RangeError + raise if words + 1 < MAX_INT + # e.g. integer #{words} too big to convert to `int' + raise Liquid::ArgumentError, "integer #{words} too big for truncatewords" + end return input if wordlist.length <= words wordlist.pop diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index 526ab91..a2456fd 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -178,6 +178,10 @@ class StandardFiltersTest < Minitest::Test assert_equal('one two three...', @filters.truncatewords("one two\tthree\nfour", 3)) assert_equal('one two...', @filters.truncatewords("one two three four", 2)) assert_equal('one...', @filters.truncatewords("one two three four", 0)) + exception = assert_raises(Liquid::ArgumentError) do + @filters.truncatewords("one two three four", 1 << 31) + end + assert_equal("Liquid error: integer #{1 << 31} too big for truncatewords", exception.message) end def test_strip_html