31f0b41
From 0912f6869b1b8f3116b3540958a395b96d8909d0 Mon Sep 17 00:00:00 2001
31f0b41
From: Dylan Thacker-Smith <Dylan.Smith@shopify.com>
31f0b41
Date: Thu, 16 Sep 2021 18:46:07 -0400
31f0b41
Subject: [PATCH] Fix some internal errors in filters from invalid input.
31f0b41
31f0b41
These fixes came from improving the corresponding test, so these might not
31f0b41
actually be causing problems in practice.
31f0b41
---
31f0b41
 History.md                               |  6 +++
31f0b41
 lib/liquid/standardfilters.rb            | 48 ++++++++++++++++--------
31f0b41
 test/integration/standard_filter_test.rb | 23 +++++-------
31f0b41
 3 files changed, 48 insertions(+), 29 deletions(-)
31f0b41
31f0b41
diff --git a/lib/liquid/standardfilters.rb b/lib/liquid/standardfilters.rb
31f0b41
index e7cb5c382..98e38f5f4 100644
31f0b41
--- a/lib/liquid/standardfilters.rb
31f0b41
+++ b/lib/liquid/standardfilters.rb
31f0b41
@@ -486,10 +498,16 @@ def apply_operation(input, operand, operation)
31f0b41
     end
31f0b41
 
31f0b41
     def nil_safe_compare(a, b)
31f0b41
-      if !a.nil? && !b.nil?
31f0b41
-        a <=> b
31f0b41
+      result = a <=> b
31f0b41
+
31f0b41
+      if result
31f0b41
+        result
31f0b41
+      elsif a.nil?
31f0b41
+        1
31f0b41
+      elsif b.nil?
31f0b41
+        -1
31f0b41
       else
31f0b41
-        a.nil? ? 1 : -1
31f0b41
+        raise Liquid::ArgumentError, "cannot sort values of incompatible types"
31f0b41
       end
31f0b41
     end
31f0b41
 
31f0b41
diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb
31f0b41
index f80d7ad0b..e7b34c164 100644
31f0b41
--- a/test/integration/standard_filter_test.rb
31f0b41
+++ b/test/integration/standard_filter_test.rb
31f0b41
@@ -259,8 +259,8 @@ def test_sort_when_property_is_sometimes_missing_puts_nils_last
31f0b41
       { "price" => 1, "handle" => "gamma" },
31f0b41
       { "price" => 2, "handle" => "epsilon" },
31f0b41
       { "price" => 4, "handle" => "alpha" },
31f0b41
-      { "handle" => "delta" },
31f0b41
-      { "handle" => "beta" }
31f0b41
+      { "handle" => "beta" },
31f0b41
+      { "handle" => "delta" }
31f0b41
     ]
31f0b41
     assert_equal expectation, @filters.sort(input, "price")
31f0b41
   end