summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-11-08 10:57:18 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-11-08 10:57:18 +0900
commit8ff001ef30f243eaffc853e9ec327a104ecb255e (patch)
tree66d4002a4f41b43d6b0662f0eb7665e7cbf7ba72
parent962776fe254f4372ab1190e33509fe7883597283 (diff)
downloadmruby-8ff001ef30f243eaffc853e9ec327a104ecb255e.tar.gz
mruby-8ff001ef30f243eaffc853e9ec327a104ecb255e.zip
Avoid crashing of `Array#unshift`; fix #4808
On cases like `a.unshift(*a)`.
-rw-r--r--src/array.c2
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);