diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-11-08 10:57:18 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2019-11-08 10:57:18 +0900 |
| commit | 8ff001ef30f243eaffc853e9ec327a104ecb255e (patch) | |
| tree | 66d4002a4f41b43d6b0662f0eb7665e7cbf7ba72 | |
| parent | 962776fe254f4372ab1190e33509fe7883597283 (diff) | |
| download | mruby-8ff001ef30f243eaffc853e9ec327a104ecb255e.tar.gz mruby-8ff001ef30f243eaffc853e9ec327a104ecb255e.zip | |
Avoid crashing of `Array#unshift`; fix #4808
On cases like `a.unshift(*a)`.
| -rw-r--r-- | src/array.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/array.c b/src/array.c index 85481fe9e..8190c2416 100644 --- a/src/array.c +++ b/src/array.c @@ -631,11 +631,13 @@ mrb_ary_unshift_m(mrb_state *mrb, mrb_value self) ptr = a->as.heap.ptr; } else { + mrb_bool same = vals == ARY_PTR(a); ary_modify(mrb, a); if (ARY_CAPA(a) < len + alen) ary_expand_capa(mrb, a, len + alen); ptr = ARY_PTR(a); value_move(ptr + alen, ptr, len); + if (same) vals = ptr; } array_copy(ptr, vals, alen); ARY_SET_LEN(a, len+alen); |
