diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-04-19 01:11:04 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-04-19 01:11:04 +0000 |
commit | 95de2b001247b5e8ccd89d5ba7225d42aafec1e5 (patch) | |
tree | c41b3bbde5e8c505e54317a1df9152d1dc63deef /marshal.c | |
parent | 8233f969a28e03bf7771424cf5a893369a14e5df (diff) |
* internal.h (struct RBignum): Use size_t for len.
* include/ruby/intern.h (rb_big_new): Use size_t instead of long to
specify the size of bignum.
(rb_big_resize): Ditto.
* bignum.c: Follow above changes.
* rational.c: Follow above changes.
* marshal.c: Follow above changes.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'marshal.c')
-rw-r--r-- | marshal.c | 14 |
1 files changed, 10 insertions, 4 deletions
@@ -35,8 +35,8 @@ #if SIZEOF_SHORT == SIZEOF_BDIGIT #define SHORTLEN(x) (x) #else -static long -shortlen(long len, BDIGIT *ds) +static size_t +shortlen(size_t len, BDIGIT *ds) { BDIGIT num; int offset = 0; @@ -774,11 +774,17 @@ w_object(VALUE obj, struct dump_arg *arg, int limit) w_byte(TYPE_BIGNUM, arg); { char sign = BIGNUM_SIGN(obj) ? '+' : '-'; - long len = BIGNUM_LEN(obj); + size_t len = BIGNUM_LEN(obj); + size_t slen; BDIGIT *d = BIGNUM_DIGITS(obj); + slen = SHORTLEN(len); + if (LONG_MAX < slen) { + rb_raise(rb_eTypeError, "too big Bignum can't be dumped"); + } + w_byte(sign, arg); - w_long(SHORTLEN(len), arg); /* w_short? */ + w_long((long)slen, arg); while (len--) { #if SIZEOF_BDIGIT > SIZEOF_SHORT BDIGIT num = *d; |