summaryrefslogtreecommitdiffhomepage
path: root/src/array.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-01-24 11:36:27 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-01-24 11:36:27 +0900
commit72bff2932ba983b4e8aaedda50fa5663dcc5c3ed (patch)
treeb69cfd15a87a62a9a685337680e4b69a7916e7d2 /src/array.c
parent28cf7a549dda15a5f76944d314ad5e20d5362df5 (diff)
downloadmruby-72bff2932ba983b4e8aaedda50fa5663dcc5c3ed.tar.gz
mruby-72bff2932ba983b4e8aaedda50fa5663dcc5c3ed.zip
Use size_t to avoid integer overflow in mrb_ary_splice(); fix #3413
Diffstat (limited to 'src/array.c')
-rw-r--r--src/array.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/array.c b/src/array.c
index 9e5b90061..c7499ab36 100644
--- a/src/array.c
+++ b/src/array.c
@@ -591,6 +591,7 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
struct RArray *a = mrb_ary_ptr(ary);
const mrb_value *argv;
mrb_int argc;
+ size_t tail;
ary_modify(mrb, a);
@@ -604,7 +605,8 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
mrb_raise(mrb, E_INDEX_ERROR, "index is out of array");
}
}
- if (a->len < len || a->len < head + len) {
+ tail = head + len;
+ if (a->len < len || (size_t)a->len < tail) {
len = a->len - head;
}
@@ -647,7 +649,8 @@ mrb_ary_splice(mrb_state *mrb, mrb_value ary, mrb_int head, mrb_int len, mrb_val
}
if (len != argc) {
- value_move(a->ptr + head + argc, a->ptr + head + len, a->len - (head + len));
+ tail = head + len;
+ value_move(a->ptr + head + argc, a->ptr + tail, a->len - tail);
a->len = alen;
}
if (argc > 0) {