Commit a2aa7e7f authored by Akira Kuroda's avatar Akira Kuroda

fix segmentation fault in Array#first

parent 919a8477
...@@ -764,6 +764,9 @@ mrb_ary_first(mrb_state *mrb, mrb_value self) ...@@ -764,6 +764,9 @@ mrb_ary_first(mrb_state *mrb, mrb_value self)
if (mrb_get_args(mrb, "|i", &size) == 0) { if (mrb_get_args(mrb, "|i", &size) == 0) {
return (a->len > 0)? a->ptr[0]: mrb_nil_value(); return (a->len > 0)? a->ptr[0]: mrb_nil_value();
} }
if (size < 0) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "negative array size");
}
if (size > a->len) size = a->len; if (size > a->len) size = a->len;
if (a->flags & MRB_ARY_SHARED) { if (a->flags & MRB_ARY_SHARED) {
......
...@@ -118,7 +118,24 @@ assert('Array#first', '15.2.12.5.13') do ...@@ -118,7 +118,24 @@ assert('Array#first', '15.2.12.5.13') do
a = [] a = []
b = [1,2,3] b = [1,2,3]
a.first == nil and b.first == 1 e2 = nil
e3 = nil
begin
# this will cause an exception due to the wrong argument
[1,2,3].first(-1)
rescue => e1
e2 = e1
end
begin
# this will cause an exception due to the wrong argument
[1,2,3].first(1,2)
rescue => e1
e3 = e1
end
a.first == nil and b.first == 1 and b.first(0) == [] and
b.first(1) == [1] and b.first(4) == [1,2,3] and
e2.class == ArgumentError and e3.class == ArgumentError
end end
assert('Array#index', '15.2.12.5.14') do assert('Array#index', '15.2.12.5.14') do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment