summaryrefslogtreecommitdiffhomepage
path: root/src/pack.c
diff options
context:
space:
mode:
authorTomoyuki Sahara <[email protected]>2013-02-15 10:39:04 +0900
committerTomoyuki Sahara <[email protected]>2013-02-15 10:45:30 +0900
commit88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f (patch)
tree6a7dbe1b0623ea8653f29a383d1406a2a5286847 /src/pack.c
parent53ff8bab179b65897d143f0a9c00d1cd7ce97a88 (diff)
downloadmruby-88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f.tar.gz
mruby-88fa5851f4967f1a1d1ec2bcb9be90adaaf3b82f.zip
fix an issue large/negative integer may not be packed/unpacked correctly.
Diffstat (limited to 'src/pack.c')
-rw-r--r--src/pack.c17
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;