diff options
Diffstat (limited to 'mrbgems/mruby-pack/src/pack.c')
| -rw-r--r-- | mrbgems/mruby-pack/src/pack.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c index ceb862d3f..3a7489f56 100644 --- a/mrbgems/mruby-pack/src/pack.c +++ b/mrbgems/mruby-pack/src/pack.c @@ -833,9 +833,10 @@ pack_x(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u { long i; + if (count < 0) return 0; dst = str_len_ensure(mrb, dst, didx + count); - for (i = 0; i < count; i++) { - RSTRING_PTR(dst)[didx] = '\0'; + for (i = didx; i < count; i++) { + RSTRING_PTR(dst)[i] = '\0'; } return count; } @@ -843,6 +844,7 @@ pack_x(mrb_state *mrb, mrb_value src, mrb_value dst, mrb_int didx, long count, u static int unpack_x(mrb_state *mrb, const void *src, int slen, mrb_value ary, int count, unsigned int flags) { + if (count < 0) return slen; if (slen < count) { mrb_raise(mrb, E_ARGUMENT_ERROR, "x outside of string"); } @@ -1050,6 +1052,9 @@ alias: count = ch - '0'; while (tmpl->idx < tlen && isdigit(tptr[tmpl->idx])) { count = count * 10 + (tptr[tmpl->idx++] - '0'); + if (count < 0) { + mrb_raisef(mrb, E_RUNTIME_ERROR, "too big template length"); + } } continue; /* special case */ } else if (ch == '*') { |
