diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-16 02:10:44 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-11-16 02:10:44 +0900 |
| commit | 1f554ff8540d61e30d0e649bf80c0ecd27b40ad6 (patch) | |
| tree | 81dd4166abb3a3f3b7eae5631b8e52af81050ced | |
| parent | 242b21947102d98aba2fa3db2725b129ca547f20 (diff) | |
| download | mruby-1f554ff8540d61e30d0e649bf80c0ecd27b40ad6.tar.gz mruby-1f554ff8540d61e30d0e649bf80c0ecd27b40ad6.zip | |
Fixed rindex calling into mrb_equal bug
Fixed by Alex Snaps and reported by Mathieu Leduc-Hamel,
both from shopify.com. Thank you!
| -rw-r--r-- | src/array.c | 5 | ||||
| -rw-r--r-- | test/t/array.rb | 12 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/array.c b/src/array.c index e8882b7a3..5a319d809 100644 --- a/src/array.c +++ b/src/array.c @@ -868,13 +868,16 @@ static mrb_value mrb_ary_rindex_m(mrb_state *mrb, mrb_value self) { mrb_value obj; - mrb_int i; + mrb_int i, len; mrb_get_args(mrb, "o", &obj); for (i = RARRAY_LEN(self) - 1; i >= 0; i--) { if (mrb_equal(mrb, RARRAY_PTR(self)[i], obj)) { return mrb_fixnum_value(i); } + if (i > (len = RARRAY_LEN(self))) { + i = len; + } } return mrb_nil_value(); } diff --git a/test/t/array.rb b/test/t/array.rb index 538ea0c3f..d887c117b 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -347,3 +347,15 @@ assert("Array (Longish inline array)") do ary.each {|p| h[p.class] += 1} assert_equal({Array=>200}, h) end + +assert("Array#rindex") do + class Sneaky + def ==(*) + $a.clear + $a.replace([1]) + false + end + end + $a = [2, 3, 4, 5, 6, 7, 8, 9, 10, Sneaky.new] + assert_equal 0, $a.rindex(1) +end |
