diff options
author | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-12-15 08:28:52 +0000 |
---|---|---|
committer | nagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2019-12-15 08:28:52 +0000 |
commit | fd3c731a31bfed559af8bd9e4ca394632bedf05a (patch) | |
tree | f56340c0c944a37ee93a1e78e9505224ad7274f3 /enum.c | |
parent | d1a33d8ec514e24cbda8c62ab529b3920f0f97f4 (diff) |
merge revision(s) ff41663403d3eb76d95f465cb94e14d2faaa04d1: [Backport #16354]
Fix memory corruption in Enumerable#reverse_each [ruby-dev:50867]
[Bug #16354]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67835 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enum.c')
-rw-r--r-- | enum.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -2337,14 +2337,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; |