summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-pack/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-02-10 16:59:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-02-10 16:59:14 +0900
commit79cfa377e16435c4673a58f98267d7117533b17e (patch)
treedff998d81ab4204c92fb1489710cf0252c60c117 /mrbgems/mruby-pack/src
parent4f31bcbc845a813411c948a01c19bc63a1716ec6 (diff)
downloadmruby-79cfa377e16435c4673a58f98267d7117533b17e.tar.gz
mruby-79cfa377e16435c4673a58f98267d7117533b17e.zip
Check negative `count` in `pack_x` and `unpack_x`; fix #3944
Diffstat (limited to 'mrbgems/mruby-pack/src')
-rw-r--r--mrbgems/mruby-pack/src/pack.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c
index 30139fb74..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");
}