diff options
| author | Tomoyuki Sahara <[email protected]> | 2013-02-15 10:39:04 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2013-02-15 10:45:30 +0900 |
| commit | 88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f (patch) | |
| tree | 6a7dbe1b0623ea8653f29a383d1406a2a5286847 | |
| parent | 53ff8bab179b65897d143f0a9c00d1cd7ce97a88 (diff) | |
| download | mruby-88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f.tar.gz mruby-88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f.zip | |
fix an issue large/negative integer may not be packed/unpacked correctly.
| -rw-r--r-- | src/pack.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/src/pack.c b/src/pack.c index 0913a9389..290f3a3f8 100644 --- a/src/pack.c +++ b/src/pack.c @@ -1,7 +1,5 @@ /* ** pack.c - Array#pack, String#unpack - ** - ** See Copyright Notice in mruby.h */ #include "mruby.h" @@ -139,7 +137,8 @@ unpack_c(mrb_state *mrb, const void *src, int srclen, mrb_value ary, unsigned in static int pack_s(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags) { - short n; + unsigned short n; + str = str_len_ensure(mrb, str, sidx + 2); n = mrb_fixnum(o); if (flags & PACK_FLAG_LITTLEENDIAN) { @@ -172,7 +171,7 @@ unpack_s(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un static int pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int flags) { - long n; + unsigned long n; str = str_len_ensure(mrb, str, sidx + 4); n = mrb_fixnum(o); if (flags & PACK_FLAG_LITTLEENDIAN) { @@ -192,7 +191,7 @@ pack_l(mrb_state *mrb, mrb_value o, mrb_value str, mrb_int sidx, unsigned int fl static int unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, unsigned int flags) { - long n; + unsigned long n; if (flags & PACK_FLAG_LITTLEENDIAN) { n = (src[3] << 24) + (src[2] << 16) + (src[1] << 8) + src[0]; @@ -200,13 +199,11 @@ unpack_l(mrb_state *mrb, const unsigned char *src, int srclen, mrb_value ary, un n = (src[0] << 24) + (src[1] << 16) + (src[2] << 8) + src[3]; } if (flags & PACK_FLAG_SIGNED) { - if (sizeof(long) > sizeof(int)) - n = 0L - n; - if (!FIXABLE(n)) - mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit signed number: %ld", n); + if (!FIXABLE((mrb_int)n)) + mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit signed number: %ld", (mrb_int)n); } else { if (!POSFIXABLE(n)) - mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit unsigned number: %ld", n); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "cannot unpack to 32bit unsigned number: %lu", n); } mrb_ary_push(mrb, ary, mrb_fixnum_value(n)); return 4; |
