From dc0e33566410489db639a0523b9cb25b04f73080 Mon Sep 17 00:00:00 2001 From: cremno Date: Mon, 1 Jun 2015 13:23:43 +0200 Subject: fix two potential cases of signed integer overflow --- src/array.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 48dc1ff10..1ca7dd2a4 100644 --- a/src/array.c +++ b/src/array.c @@ -298,6 +298,9 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) mrb_int blen; mrb_get_args(mrb, "a", &ptr, &blen); + if (ARY_MAX_SIZE - blen < a1->len) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); + } ary = mrb_ary_new_capa(mrb, a1->len + blen); a2 = mrb_ary_ptr(ary); array_copy(a2->ptr, a1->ptr, a1->len); @@ -351,7 +354,9 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) mrb_raise(mrb, E_ARGUMENT_ERROR, "negative argument"); } if (times == 0) return mrb_ary_new(mrb); - + if (ARY_MAX_SIZE / times < a1->len) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); + } ary = mrb_ary_new_capa(mrb, a1->len * times); a2 = mrb_ary_ptr(ary); ptr = a2->ptr; -- cgit v1.2.3 From 599d141cc8fa7b04398d564b09893f6754906f3e Mon Sep 17 00:00:00 2001 From: cremno Date: Tue, 2 Jun 2015 08:34:36 +0200 Subject: directly call ary_new_capa() --- src/array.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 1ca7dd2a4..f2584114d 100644 --- a/src/array.c +++ b/src/array.c @@ -88,15 +88,12 @@ array_copy(mrb_value *dst, const mrb_value *src, mrb_int size) MRB_API mrb_value mrb_ary_new_from_values(mrb_state *mrb, mrb_int size, const mrb_value *vals) { - mrb_value ary; - struct RArray *a; + struct RArray *a = ary_new_capa(mrb, size); - ary = mrb_ary_new_capa(mrb, size); - a = mrb_ary_ptr(ary); array_copy(a->ptr, vals, size); a->len = size; - return ary; + return mrb_obj_value(a); } MRB_API mrb_value @@ -293,7 +290,6 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) { struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2; - mrb_value ary; mrb_value *ptr; mrb_int blen; @@ -301,13 +297,12 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) if (ARY_MAX_SIZE - blen < a1->len) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } - ary = mrb_ary_new_capa(mrb, a1->len + blen); - a2 = mrb_ary_ptr(ary); + a2 = ary_new_capa(mrb, a1->len + blen); array_copy(a2->ptr, a1->ptr, a1->len); array_copy(a2->ptr + a1->len, ptr, blen); a2->len = a1->len + blen; - return ary; + return mrb_obj_value(a2); } static void @@ -345,7 +340,6 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) { struct RArray *a1 = mrb_ary_ptr(self); struct RArray *a2; - mrb_value ary; mrb_value *ptr; mrb_int times; @@ -357,8 +351,7 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) if (ARY_MAX_SIZE / times < a1->len) { mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } - ary = mrb_ary_new_capa(mrb, a1->len * times); - a2 = mrb_ary_ptr(ary); + a2 = ary_new_capa(mrb, a1->len * times); ptr = a2->ptr; while (times--) { array_copy(ptr, a1->ptr, a1->len); @@ -366,7 +359,7 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) a2->len += a1->len; } - return ary; + return mrb_obj_value(a2); } static mrb_value @@ -393,11 +386,8 @@ mrb_ary_reverse_bang(mrb_state *mrb, mrb_value self) static mrb_value mrb_ary_reverse(mrb_state *mrb, mrb_value self) { - struct RArray *a = mrb_ary_ptr(self), *b; - mrb_value ary; + struct RArray *a = mrb_ary_ptr(self), *b = ary_new_capa(mrb, a->len); - ary = mrb_ary_new_capa(mrb, a->len); - b = mrb_ary_ptr(ary); if (a->len > 0) { mrb_value *p1, *p2, *e; @@ -409,7 +399,7 @@ mrb_ary_reverse(mrb_state *mrb, mrb_value self) } b->len = a->len; } - return ary; + return mrb_obj_value(b); } MRB_API void -- cgit v1.2.3 From ef0fc90cd007d613be6c268cc6adbecc8d7a0a8f Mon Sep 17 00:00:00 2001 From: cremno Date: Tue, 2 Jun 2015 08:56:41 +0200 Subject: remove unnecessary mrb_immediate_p() `!mrb_array_p(ary2)` and `mrb_type(obj) != MRB_TT_DATA` are sufficient. --- src/array.c | 2 -- src/etc.c | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 1ca7dd2a4..c97e7a53b 100644 --- a/src/array.c +++ b/src/array.c @@ -1052,7 +1052,6 @@ mrb_ary_eq(mrb_state *mrb, mrb_value ary1) mrb_get_args(mrb, "o", &ary2); if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_true_value(); - if (mrb_immediate_p(ary2)) return mrb_false_value(); if (!mrb_array_p(ary2)) { return mrb_false_value(); } @@ -1068,7 +1067,6 @@ mrb_ary_cmp(mrb_state *mrb, mrb_value ary1) mrb_get_args(mrb, "o", &ary2); if (mrb_obj_equal(mrb, ary1, ary2)) return mrb_fixnum_value(0); - if (mrb_immediate_p(ary2)) return mrb_nil_value(); if (!mrb_array_p(ary2)) { return mrb_nil_value(); } diff --git a/src/etc.c b/src/etc.c index 635052b67..a8a21e740 100644 --- a/src/etc.c +++ b/src/etc.c @@ -26,7 +26,7 @@ mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb MRB_API void mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) { - if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { + if (mrb_type(obj) != MRB_TT_DATA) { mrb_check_type(mrb, obj, MRB_TT_DATA); } if (DATA_TYPE(obj) != type) { @@ -48,7 +48,7 @@ mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) MRB_API void* mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) { - if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { + if (mrb_type(obj) != MRB_TT_DATA) { return NULL; } if (DATA_TYPE(obj) != type) { -- cgit v1.2.3 From bdbd696c486f88a2239420a027f7e1772713bbe0 Mon Sep 17 00:00:00 2001 From: jbreeden Date: Sat, 11 Jul 2015 21:03:04 -0700 Subject: Patching array join --- src/array.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index f48719310..ff0bb8a85 100644 --- a/src/array.c +++ b/src/array.c @@ -295,7 +295,7 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self) mrb_get_args(mrb, "a", &ptr, &blen); if (ARY_MAX_SIZE - blen < a1->len) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } a2 = ary_new_capa(mrb, a1->len + blen); array_copy(a2->ptr, a1->ptr, a1->len); @@ -349,7 +349,7 @@ mrb_ary_times(mrb_state *mrb, mrb_value self) } if (times == 0) return mrb_ary_new(mrb); if (ARY_MAX_SIZE / times < a1->len) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); + mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big"); } a2 = ary_new_capa(mrb, a1->len * times); ptr = a2->ptr; @@ -1031,7 +1031,13 @@ mrb_ary_join_m(mrb_state *mrb, mrb_value ary) { mrb_value sep = mrb_nil_value(); - mrb_get_args(mrb, "|S", &sep); + mrb_get_args(mrb, "|o", &sep); + if (mrb_nil_p(sep)) { + sep = mrb_str_to_str(mrb, sep); + } else if (mrb_type(sep) != MRB_TT_STRING) { + mrb_raise(mrb, E_TYPE_ERROR, "expected String"); + return mrb_nil_value(); + } return mrb_ary_join(mrb, ary, sep); } -- cgit v1.2.3 From dd558a108d20d2198cb52cf743e2ecfc868cfa1c Mon Sep 17 00:00:00 2001 From: jbreeden Date: Sat, 11 Jul 2015 21:15:33 -0700 Subject: Removing unndeeded to_s --- src/array.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index ff0bb8a85..2fb662c92 100644 --- a/src/array.c +++ b/src/array.c @@ -1032,9 +1032,7 @@ mrb_ary_join_m(mrb_state *mrb, mrb_value ary) mrb_value sep = mrb_nil_value(); mrb_get_args(mrb, "|o", &sep); - if (mrb_nil_p(sep)) { - sep = mrb_str_to_str(mrb, sep); - } else if (mrb_type(sep) != MRB_TT_STRING) { + if (!(mrb_nil_p(sep) || mrb_type(sep) == MRB_TT_STRING)) { mrb_raise(mrb, E_TYPE_ERROR, "expected String"); return mrb_nil_value(); } -- cgit v1.2.3 From d0e67aada795620c2bce49db8c73e87718753614 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 13 Jul 2015 11:18:44 +0900 Subject: use "S!" specifier of mrb_get_args() to improve #2882 fix. --- src/array.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 2fb662c92..0a99040c0 100644 --- a/src/array.c +++ b/src/array.c @@ -1031,11 +1031,7 @@ mrb_ary_join_m(mrb_state *mrb, mrb_value ary) { mrb_value sep = mrb_nil_value(); - mrb_get_args(mrb, "|o", &sep); - if (!(mrb_nil_p(sep) || mrb_type(sep) == MRB_TT_STRING)) { - mrb_raise(mrb, E_TYPE_ERROR, "expected String"); - return mrb_nil_value(); - } + mrb_get_args(mrb, "|S!", &sep); return mrb_ary_join(mrb, ary, sep); } -- cgit v1.2.3 From c7fad5aa33f77d1869d9b879c9f8aeb5e688d64c Mon Sep 17 00:00:00 2001 From: "go.kikuta" Date: Wed, 12 Aug 2015 10:20:55 +0900 Subject: Remove duplicated RARRAY_LEN check --- src/array.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src/array.c') diff --git a/src/array.c b/src/array.c index 0a99040c0..2622ee528 100644 --- a/src/array.c +++ b/src/array.c @@ -19,7 +19,6 @@ static inline mrb_value ary_elt(mrb_value ary, mrb_int offset) { - if (RARRAY_LEN(ary) == 0) return mrb_nil_value(); if (offset < 0 || RARRAY_LEN(ary) <= offset) { return mrb_nil_value(); } -- cgit v1.2.3