diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-01-24 11:36:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-01-24 11:36:27 +0900 |
| commit | 72bff2932ba983b4e8aaedda50fa5663dcc5c3ed (patch) | |
| tree | b69cfd15a87a62a9a685337680e4b69a7916e7d2 /src/array.c | |
| parent | 28cf7a549dda15a5f76944d314ad5e20d5362df5 (diff) | |
| download | mruby-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.c | 7 |
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) { |
