From ff41663403d3eb76d95f465cb94e14d2faaa04d1 Mon Sep 17 00:00:00 2001 From: Kazuki Tsujimoto Date: Tue, 19 Nov 2019 09:35:47 -0600 Subject: Fix memory corruption in Enumerable#reverse_each [ruby-dev:50867] [Bug #16354] --- enum.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'enum.c') diff --git a/enum.c b/enum.c index 0653280f8f..a41144993e 100644 --- a/enum.c +++ b/enum.c @@ -2419,14 +2419,20 @@ static VALUE enum_reverse_each(int argc, VALUE *argv, VALUE obj) { VALUE ary; - long i; + long len; RETURN_SIZED_ENUMERATOR(obj, argc, argv, enum_size); ary = enum_to_a(argc, argv, obj); - for (i = RARRAY_LEN(ary); --i >= 0; ) { - rb_yield(RARRAY_AREF(ary, i)); + len = RARRAY_LEN(ary); + while (len--) { + long nlen; + rb_yield(RARRAY_AREF(ary, len)); + nlen = RARRAY_LEN(ary); + if (nlen < len) { + len = nlen; + } } return obj; -- cgit v1.2.3