summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-12-31 23:09:56 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-12-31 23:09:56 +0900
commit9d84f0d47b474711e8e8d944a1433154a4d85662 (patch)
tree85c9bb7858dfe0c0cc70f725f91c19a5aab0091e /src
parent270ea41b376d82b9685746ea363f64cbc84e79c9 (diff)
downloadmruby-9d84f0d47b474711e8e8d944a1433154a4d85662.tar.gz
mruby-9d84f0d47b474711e8e8d944a1433154a4d85662.zip
ary_expand_capa(): size calculation by size_t; fix #3353
Also more size checks added.
Diffstat (limited to 'src')
-rw-r--r--src/array.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/array.c b/src/array.c
index 2ce4e5dc6..385f603ed 100644
--- a/src/array.c
+++ b/src/array.c
@@ -165,9 +165,9 @@ ary_make_shared(mrb_state *mrb, struct RArray *a)
}
static void
-ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len)
+ary_expand_capa(mrb_state *mrb, struct RArray *a, size_t len)
{
- mrb_int capa = a->aux.capa;
+ size_t capa = a->aux.capa;
if (len > ARY_MAX_SIZE) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
@@ -177,14 +177,16 @@ ary_expand_capa(mrb_state *mrb, struct RArray *a, mrb_int len)
capa = ARY_DEFAULT_LEN;
}
while (capa < len) {
- if (capa <= ARY_MAX_SIZE / 2) {
- capa *= 2;
- } else {
+ capa *= 2;
+ if (capa > ARY_MAX_SIZE) {
capa = ARY_MAX_SIZE;
}
}
+ if (capa < len || capa > MRB_INT_MAX) {
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "array size too big");
+ }
- if (capa > a->aux.capa) {
+ if (capa > (size_t)a->aux.capa) {
mrb_value *expanded_ptr = (mrb_value *)mrb_realloc(mrb, a->ptr, sizeof(mrb_value)*capa);
a->aux.capa = capa;