diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-09-17 23:52:14 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-09-18 07:07:43 +0900 |
| commit | e9b1d9dc2f1de290da4aadfd39f1957502d67e18 (patch) | |
| tree | 961eba51ef1b161acb910b75fecef3a9e1235458 /mrbgems/mruby-array-ext/src/array.c | |
| parent | 0ff1540e8ba6031474fa584b3d15ab5836c0bf7f (diff) | |
| download | mruby-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/mruby-array-ext/src/array.c')
| -rw-r--r-- | mrbgems/mruby-array-ext/src/array.c | 5 |
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(); |
