summaryrefslogtreecommitdiffhomepage
path: root/mrbgems
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-09-17 23:52:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-09-18 07:07:43 +0900
commite9b1d9dc2f1de290da4aadfd39f1957502d67e18 (patch)
tree961eba51ef1b161acb910b75fecef3a9e1235458 /mrbgems
parent0ff1540e8ba6031474fa584b3d15ab5836c0bf7f (diff)
downloadmruby-e9b1d9dc2f1de290da4aadfd39f1957502d67e18.tar.gz
mruby-e9b1d9dc2f1de290da4aadfd39f1957502d67e18.zip
Array size may be changed in `mrb_get_args()` reentry.
fix #4116; fix #4117; fix #4118; fix #4119; fix #4120
Diffstat (limited to 'mrbgems')
-rw-r--r--mrbgems/mruby-array-ext/src/array.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c
index 169f968f9..792eb26de 100644
--- a/mrbgems/mruby-array-ext/src/array.c
+++ b/mrbgems/mruby-array-ext/src/array.c
@@ -175,7 +175,7 @@ static mrb_value
mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
- mrb_int i, j, k, len, alen = ARY_LEN(a);
+ mrb_int i, j, k, len, alen;
mrb_value val;
mrb_value *ptr;
mrb_value ary;
@@ -188,7 +188,7 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "o|i", &index, &len);
switch (mrb_type(index)) {
case MRB_TT_RANGE:
- if (mrb_range_beg_len(mrb, index, &i, &len, alen, TRUE) == 1) {
+ if (mrb_range_beg_len(mrb, index, &i, &len, ARY_LEN(a), TRUE) == 1) {
goto delete_pos_len;
}
else {
@@ -205,6 +205,7 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "ii", &i, &len);
delete_pos_len:
+ alen = ARY_LEN(a);
if (i < 0) i += alen;
if (i < 0 || alen < i) return mrb_nil_value();
if (len < 0) return mrb_nil_value();